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;
}
来源:CSDN
作者:Dpply
链接:https://blog.csdn.net/dhy_dpply/article/details/104802677