#include<iostream>#include<vector>#include<algorithm>usingnamespace std;voidswap03(int& a,int& b){int temp = a;
a = b;
b = temp;}intmain(){
vector<int> arr ={2,3,8,99,55,64,28,37,11};bubbleSort(arr);selectionSort(arr);insertionSort(arr);shellSort(arr);mergeSort(arr);quickSort(arr);heapSort(arr);countingSort(arr);bucketSort(arr);radixSort(arr);for(auto s : arr){
cout<<s<<" ";}
cout<<endl;return0;}
冒泡排序
// 冒泡排序 将小的数往前“冒泡”voidbubbleSort(vector<int>& arr){int len = arr.size();for(int i =0; i<len;++i){for(int j = i; j<len;++j){if(arr[i]> arr[j]){swap03(arr[i],arr[j]);}}}}
选择排序
// 选择排序 从未排序元素中找到小的数,放到已排序序列的末尾voidselectionSort(vector<int>& arr){int len = arr.size();for(int i =0; i<len;++i){int index = i, min = arr[i];for(int j = i; j<len;++j){if(min > arr[j]){
min = arr[j];
index = j;}}swap03(arr[index], arr[i]);}}
// 堆排序 利用堆这种数据结构所设计的排序算法voidadjustHeap(vector<int>& arr,int i,int len_heap){// 调整(大顶)堆,(仅是调整过程,建立在大顶堆已构建的基础上)int temp = arr[i];for(int k =2*i+1; k<len_heap; k =2*i+1){if(k+1<len_heap && arr[k]<arr[k+1]){
k++;}if(temp < arr[k]){// (大顶)
arr[i]= arr[k];
i = k;}elsebreak;}
arr[i]= temp;}voidheapSort(vector<int>& arr){int len = arr.size();// 构建(大顶)堆for(int i = len/2-1; i>-1;--i){// 从第一个非叶子结点从下至上,从右至左调整结构adjustHeap(arr, i, len);}for(int i = len-1; i>0;--i){swap03(arr[0], arr[i]);// 将堆顶元素与末尾元素进行交换adjustHeap(arr,0, i);// 重新对堆进行调整}}
计数排序
//计数排序 其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中voidcountingSort(vector<int>& arr,int min,int max){
vector<int>temp(max-min+1,0);int len = arr.size();for(int i =0; i<len;++i){// 统计数组中每个值出现的次数
temp[arr[i]-min]++;}int t =0;for(int i =0; i<len;++i){while(temp[t]==0) t++;
arr[i]= min + t;
temp[t]--;}}voidcountingSort(vector<int>& arr){int len = arr.size();int max = arr[0], min = arr[0];for(int i =0; i<len;++i){if(max < arr[i]) max = arr[i];if(min > arr[i]) min = arr[i];}countingSort(arr, min, max);// 计数排序要求输入的数据必须是有确定范围的整数}
桶排序
//桶排序 计数排序的升级版。它利用了函数的映射关系,效率的关键就在于这个映射函数voidbucketSort(vector<int>& arr){int len = arr.size();int max = arr[0], min = arr[0];for(int i =0; i<len;++i){if(max < arr[i]) max = arr[i];if(min > arr[i]) min = arr[i];}int DEFAULT_BUCKET_SIZE =5;// 设置桶的默认容量为5int bucket_count =(max-min)/ DEFAULT_BUCKET_SIZE +1;
vector<vector<int>>temp(bucket_count);for(int i =0; i<len;++i){// 利用映射函数将数据分配到各个桶中
temp[(arr[i]-min)/DEFAULT_BUCKET_SIZE].push_back(arr[i]);}int t =0;for(int i =0; i<bucket_count;++i){insertionSort(temp[i]);// 对每个桶进行排序,这里使用了插入排序for(int j =0; j<temp[i].size();++j){
arr[t++]= temp[i][j];}}}
基数排序
//基数排序 按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位voidradixSort(vector<int>& arr){int len = arr.size();int max = arr[0], num_radix =1;for(int i =0; i<len;++i){if(max < arr[i]) max = arr[i];}while(max/10){
max = max /10;
num_radix++;// 取得数组中的最大数,并取得位数}int mod =10,dev =1;for(int i =1; i<=num_radix;++i, mod*=10, dev*=10){
vector<vector<int>>arr_radix(10);for(int j =0; j<len;++j){
arr_radix[arr[j]%mod/dev].push_back(arr[j]);// 从最低位开始,按每个位组成radix数组}int pos =0;for(int j =0; j<10;++j){for(int k =0; k<arr_radix[j].size();++k){
arr[pos++]= arr_radix[j][k];// 类似计数排序}}}}