1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int partition(vector<int> &arry, int lo, int hi); 6 void qsort(vector<int> &arry, int lo, int hi); 7 void qsort_3way(vector<int> &arry, int lo, int hi); 8 void sink(vector<int> &arry, int k); 9 void heap_sort(vector<int> &arry); 10 11 int main() 12 { 13 vector<int> v ={8,-4,-45,-1,-1,-1,-1,12,-12,-12,-12,-56,2,3,-3,-3,3,3,-3}; 14 15 //qsort_3way(v, 0, v.size()-1); 16 heap_sort(v); 17 18 for(auto x:v) 19 cout<<x<<" "; 20 21 return 0; 22 } 23 24 void qsort(vector<int> &arry, int lo, int hi) 25 { 26 if(lo >= hi) return; //递归出口 && 注意是等于 27 28 int j = partition(arry, lo, hi); //获取j的位置,分区 29 30 qsort(arry, lo, j-1); //左区分治 31 qsort(arry, j+1, hi); //右区分治 32 } 33 34 int partition(vector<int> &arry, int lo, int hi) 35 { 36 int i=lo, j=hi+1; 37 int base = arry[lo]; 38 39 while(true) 40 { 41 while( j>lo && base < arry[--j] ); //从后面找比base小的元素 42 43 while( i<hi && base > arry[++i] ); //从前面找比base大的元素 44 45 if(i >= j) break; //注意是等于号 46 47 swap(arry[i], arry[j]); 48 } 49 50 swap(arry[lo], arry[j]); //确定j的位置 51 52 return j; 53 } 54 55 void qsort_3way(vector<int> &arry, int lo, int hi) 56 { 57 if(lo >= hi) return; 58 59 int lt=lo, i=lo+1, gt=hi; 60 int pivot = arry[lo]; 61 62 while(i <= gt) 63 { 64 if(arry[i]<pivot) 65 swap(arry[lt++], arry[i++]); //i++, 应为 lt->pivot, 交换后lt++ -> pivot, i++处理新数 66 else if(arry[i]>pivot) 67 swap(arry[gt--], arry[i]); //注意i不变,因为从后面换过来,不知道大小 68 else 69 i++; 70 } 71 72 qsort_3way(arry,lo,lt-1); 73 qsort_3way(arry,gt+1,hi); 74 } 75 76 77 void sink(vector<int> &arry, int k, int N) 78 { 79 while( 2*k+1 <= N) 80 { 81 int j = 2*k+1; 82 83 if(j<N && arry[j]<arry[j+1]) j++; 84 85 if(arry[k]>=arry[j]) break; 86 87 swap(arry[k], arry[j]); 88 89 k = j; 90 } 91 92 } 93 94 void heap_sort(vector<int> &arry) 95 { 96 int N = arry.size()-1; 97 98 for(int k = N/2; k >=0; k--) 99 sink(arry,k,N); 100 101 while(N > 0) 102 { 103 swap(arry[N--], arry[0]); 104 sink(arry,0,N); 105 } 106 107 }