vector<int> bubble_sort(vector<int>array){ int n = array.size(); for (int i = 0; i < n; i++) { for (int j = 0; j < n-i-1; j++) { if(array[j]>array[j+1]){ int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } returnarray; }
算法分析
最佳情况:T(n) = O(n) 使用一个flag,当遍历一遍都不交换时,直接返回
最差情况:T(n) = O(n2)
平均情况:T(n) = O(n2)
稳定
2、选择排序
从左往右,依次寻找当前数列中最小的数字,并交换到最前面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
vector<int> sort(vector<int>array){ int n = array.size(); for (int i = 0; i < n; i++) { int minIndex = i; for (int j = i; j < n; j++) { if(array[j]<array[minIndex]) minIndex = j; } int temp = array[minIndex]; array[minIndex] = array[i]; array[i] = temp; } returnarray; }
最佳情况:T(n) = O(n2)
最差情况:T(n) = O(n2)
平均情况:T(n) = O(n2)
不稳定
3、插入排序
从左往右,依次将本数字插入到第一个小于它的数字后。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
vector<int> sort(vector<int>array){ int n = array.size(); for (int i = 1; i < n; i++) { int current = array[i]; int j = i-1; while(current<array[j]&&j>=0){ array[j+1] = array[j]; j--; } array[j+1] = current; } returnarray; }
最佳情况:T(n) = O(n)
最坏情况:T(n) = O(n2)
平均情况:T(n) = O(n2)
稳定
4、希尔排序
相对于插入排序,希尔排序通过分组的方式将排序的范围拉的更宽,使靠后的小数字可以更快地被换到前面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
vector<int> sort(vector<int>array){ int n = array.size(); int gap = n/2; int temp,preIndex; while(gap>0){ for(int i = gap;i<n;i++){ preIndex = i-gap; temp = array[i]; while(preIndex>=0&&array[preIndex]>temp){ array[preIndex+gap] = array[preIndex]; preIndex -= gap; } array[preIndex+gap] = temp; } gap /= 2; } returnarray; }
vector<int> merge(vector<int>left, vector<int>right){ int l = left.size(); int r = right.size(); vector<int>res; for(int index = 0, i = 0, j = 0; index<l+r; index++){ if(i>=l){ res.push_back(right[j++]); }elseif(j>=r){ res.push_back(left[i++]); }elseif(left[i]<right[j]){ res.push_back(left[i++]); }else{ res.push_back(right[j++]); } } return res; }
vector<int> sort(vector<int>array){ int n = array.size(); if(n<2) returnarray; int mid = n/2; vector<int>left(array.begin(),array.begin()+mid); vector<int>right(array.begin()+mid,array.end()); return merge(sort(left),sort(right)); }
最佳情况:$T(n) = O(log_2n)$
最坏情况:$T(n) = O(log_2n)$
平均情况:$T(n) = O(log_2n)$
不稳定
6、快速排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
intpartition(vector<int>&array, int low, int high){ int temp = array[low]; while(low<high){ while(array[high]>temp&&low<high) high--; array[low] = array[high]; while(array[low]<temp&&low<high) low++; array[high] = array[low]; } array[low] = temp; return low; }
voidsort(vector<int>&array, int low, int high){ if(low<high){ int index = partition(array,low,high); sort(array,low,index-1); sort(array,index+1,high); } }
voidsort(vector<int>&array, int low, int high){ int len = array.size(); if(len<2)return; //构造初始堆 for(int i = len/2-1;i>=0;i--){ adjustHeap(array,i,len); } //将最大值交换到最后,继续调整 for(int i = len-1;i>0;i--){ int temp = array[i]; array[i] = array[0]; array[0] = temp; adjustHeap(array,0,i); } }
voidsort(vector<int>&array){ int n = array.size(); if(n<2) return; int maxValue = array[0]; int minValue = array[0]; for(int i = 1;i<n;i++){ maxValue = max(maxValue,array[i]); minValue = min(minValue,array[i]); } int len = maxValue-minValue+1;
//构建大小为10的桶 vector<int>bucket(len); //向桶中放数据 for(int i = 0;i<len;i++){ int num = array[i]-minValue; bucket[num]++; } //将桶中的数据放回原数据 int index = 0; for(int i = 0;i<len;i++){ while(bucket[i]!=0){ bucket[i]--; array[index] = i+minValue; index++; } } }
voidsort(vector<int>&array){ int n = array.size(); if(n<2) return; int maxValue = array[0]; int minValue = array[0]; for(int i = 1;i<n;i++){ maxValue = max(maxValue,array[i]); minValue = min(minValue,array[i]); } //构建桶 int len = (maxValue-minValue)/n+1; vector<vector<int> >bucket(len); //将数据填入桶中 for(int i = 0;i<n;i++){ int num = (array[i]-minValue)/n; bucket[num].push_back(array[i]); } for(int i = 0;i<len;i++){ sort(bucket[i].begin(),bucket[i].end()); } //将桶中的数据放回原数据 int index = 0; for(int i = 0;i<len;i++){ for(int j=0;j<bucket[i].size();j++){ array[index] = bucket[i][j]; index++; } } }
voidsort(vector<int>&array){ int n = array.size(); if(n<2) return; int maxValue = array[0]; for(int i = 1;i<n;i++){ maxValue = max(maxValue,array[i]); } int len = 0; while(maxValue!=0){ maxValue/=10; len++; } //构建大小为10的桶 vector<vector<int> >bucket(10); //向桶中放数据 int mod = 10, div = 1; for(int i = 0;i<len;i++){ for(int j = 0;j<n;j++){ int num = (array[j]%mod)/div; bucket[num].push_back(array[j]); } //将桶中的数据放回原数据 int index = 0; for(int i = 0;i<10;i++){ for(int j=0;j<bucket[i].size();j++){ array[index] = bucket[i][j]; index++; } } } }