C++风格的常用排序算法(冒泡,选择,插入,归并,选择)

时光毁灭记忆、已成空白 提交于 2020-03-12 07:45:31

C++风格的常用排序算法(冒泡,选择,插入,归并,选择)


#include <vector>
#include <array>
#include <iostream>
using namespace std;
#define vint vector<int>
//异或置换函数
void swapab(int&a,int&b){
    a = a^b;
    b = a^b;
    a = a^b;
}
//冒泡排序
vint mp(vint arr){
    int temp = 0;
    for (int i = 0; i<arr.size();i++) {
        for (int j = 0;j<arr.size()-i-1;j++) {
            if(arr[j] >arr[j+1]){
                swapab(arr[j],arr[j+1]);
            }
        }
    }
    return arr;
}
//选择排序
vint xz(vint arr){
    int is = 0;
    int currMin = 0;
    int temp = 0;
    for (int i = 0; i<arr.size();i++) {
        currMin = i;
        for (int j = i;j<arr.size();j++) {
            if(arr[currMin] > arr[j]){
                currMin = j;
            }
        }
        //交换
        swapab(arr[currMin],arr[i]);

        //打印过程
        for_each(arr.begin(),arr.end(),[](int& is){
            cout<<is;
        });
        cout<<" "<<currMin<< " "<<i<<endl;
    }
    return arr;
}
//插入排序
vint cr(vint arr){
    int temp = 0;
    if(arr.size()<=1){
        return arr;
    }
    for (int i = 1;i<arr.size();i++) {
        for (int j = i;j>=0;j--) {
            if(arr[j-1] > arr[j]){
                swapab(arr[j-1],arr[j]);
            }else {
                break;
            }
        }
        //打印过程
        for_each(arr.begin(),arr.end(),[](int& is){
            cout<<is;
        });
        cout<<endl;
    }
    return arr;
}
//归并排序 
vint merge(vint left,vint right){
    vint result;
    //分配空间
    result.resize(left.size()+right.size());
    for(int index = 0,i=0,j=0;index<result.size();index++)
    {
        //如果left填满了
        if(i>= left.size())         result[index] = right[j++];
        //如果right填满了
        else if (j>=right.size())   result[index] = left[i++];
        //如果右比左边小 填右边
        else if (left[i] > right[j])result[index] = right[j++];
        //如果左边比右边小 填左边
        else                        result[index] = left[i++];
    }
    //过程打印
    for_each(result.begin(),result.end(),[](int& is){
        cout<<is;
    });
    cout<<endl;
    //返回组合后的数字段
    return  result;
}
vint MergeSort(vint arr){
    //如果只有一个就只返回一个
    if(arr.size()<2){return arr;}

    //拆分
    int mid = arr.size()/2;
    vint left(arr.begin(),arr.begin()+mid);
    vint right(arr.begin()+mid,arr.end());

    //流程打印
    for_each(left.begin(),left.end(),[](int& is){
        cout<<is;
    });
    cout<<"---";
    for_each(right.begin(),right.end(),[](int& is){
        cout<<is;
    });
    cout<<endl;
    //迭代拆分排序
    return merge(MergeSort(left),MergeSort(right));
}
//快速排序
void quick_sort(vint&arr, int l, int r){
    if (l < r){
       // swapab(arr[l], arr[(l + r) / 2]); // 中间数作为基准数 将中间的这个数和第一个数交换 参见注1
        int i = l, j = r, x = arr[l];
        while (i < j)
        {
            while(i < j && arr[j] >= x) // 从右向左找第一个小于x的数
                j--;
            if(i < j)
            {
                arr[i++] = arr[j];
//                //便于观察过程
//                int tt = arr[i];
//                arr[i] = arr[j];
//                cout<<"arrj"<<j<<":"<<arr[j]<<"->"<<"arri"<<i<<":"<<tt<<" "<<x<<" =curr["<<j<<" "<<i<<"]"<<endl;
//                i++;
            }
            while(i < j && arr[i] < x) // 从左向右找第一个大于等于x的数
                i++;
            if(i < j)
            {
                arr[j--] = arr[i];
//                //便于观察过程
//                int tt = arr[j];
//                arr[j] = arr[i];
//                cout<<"Arri"<<i<<":"<<arr[i]<<"->"<<"Arrj"<<j<<":"<<tt<<" "<<x<<" =curr["<<i<<" "<<j<<"]"<<endl;
//                j--;
            }
        }
        //把最后一个坑填上第一个坑的值,表示一次填坑完成
        arr[i] = x;

        for_each(arr.begin(),arr.end(),[](int& is){
            cout<<is;
        });
        cout <<endl;
        //根据上一次的坑,划分左右继续填坑,直到l=r
        quick_sort(arr, l, i - 1); // 递归调用
        quick_sort(arr, i + 1, r);
    }
}
vint ks(vint arr){
    quick_sort(arr,0,arr.size()-1);
    return arr;
}


int main(int argc, char *argv[])
{
    std::vector<int> arr= {6,2,1,3,4,9,5,8,6,7,0,2,1,3,4,9,5,8,6,7,0};
    cout <<endl;
    for_each(arr.begin(),arr.end(),[](int& is){
        cout<<is;
    });
    cout <<endl<<"----------"<<endl;

//    //冒泡
//    arr = mp(arr);
//    //选择
//    arr = xz(arr);
//    //插入
//    arr =cr(arr);
//    //归并
//    arr = MergeSort(arr);
    //快速
    arr = ks(arr);

    cout <<endl;
    for_each(arr.begin(),arr.end(),[](int& is){
        cout<<is;
    });

      return 0;
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!