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 }