一、快速排序算法步骤:(从小到大排序)
1. 在数组中选一个基准数(通常为数组第一个);
2. 将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边;
3. 对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序。
实例演示
这个算法就是先找一个基准,对着一个[l,r]区间按照基准排过序后(也不算排序,就是大于基准的放右边,小于基准的放左边)。这个时候假设基准在数组中下标为x。这个时候在对[l,x)和(x,r]则两个区间在进行一次这样的排序。一直进行到区间内部只剩下一个元素就截至
这个时候数组内元素已经排好序了
代码:
1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm> 4 #include <iostream> 5 using namespace std; 6 const int N = 7; 7 const int MAX = 0x3f3f3f3f; 8 int root[N+1][N+1]; 9 double e[N+2][N+1],w[N+2][N+1]; 10 double p[N + 1] = { 0.04 ,0.06, 0.08, 0.02, 0.10, 0.12, 0.14 }; 11 double q[N + 1] = { 0.06 ,0.06, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05 }; 12 void bst_search_tree() 13 { 14 memset(w, 0, sizeof(w)); 15 for (int i = 1; i <= N+1; ++i) 16 { 17 root[i][i] = i; 18 e[i][i - 1] = w[i][i - 1] = q[i - 1]; 19 } 20 for (int len = 1; len <= N; ++len) 21 { 22 for (int i = 1; i <= N - len + 1; ++i) 23 { 24 int j = i + len - 1; 25 w[i][j] = w[i][j - 1] + p[j] + q[j]; 26 e[i][j] = MAX; 27 for (int r = i; r <= j; ++r) 28 { 29 double tmp = e[i][r - 1] + e[r + 1][j] + w[i][j]; 30 if (tmp < e[i][j]) 31 { 32 e[i][j] = tmp; 33 root[i][j] = r; 34 } 35 } 36 } 37 } 38 } 39 void print(int s,int e) 40 { 41 if (!(root[s][e] >= s && root[s][e] <= e)) return; 42 if (s == 1 && e == N) 43 { 44 cout << "tree root" << " " << root[s][e] << endl; 45 } 46 if (root[s][e] != s) { 47 cout << root[s][e] << " left root " << root[s][root[s][e]-1] << endl; 48 } 49 if (root[s][e] != e) { 50 cout << root[s][e] << " right root " << root[root[s][e] + 1][e] << endl; 51 } 52 print(root[s][e] + 1, e); 53 //printf("----------"); 54 print(s, root[s][e] - 1); 55 56 57 } 58 const int NN = 1005; 59 int sort_c[NN] = { 3,5,1,2,4 }; 60 void sort_s(int s, int e) 61 { 62 if (s >= e) return; 63 int l = s, r = e, m = sort_c[s]; 64 while (l < r) 65 { 66 while (m < sort_c[r] && l < r) 67 { 68 r--; 69 } 70 if (l<r) { 71 sort_c[l++] = sort_c[r]; 72 } 73 while (m > sort_c[l] && l < r) 74 { 75 l++; 76 } 77 if (l<r) { 78 sort_c[r--] = sort_c[l]; 79 } 80 } 81 sort_c[l] = m; 82 sort_s(s, m-1); 83 sort_s(m + 1, e); 84 } 85 86 int main() 87 { 88 /*最优二叉查找树测试 89 bst_search_tree(); 90 print(1, N);*/ 91 int n; 92 cin >> n; 93 for (int i = 0; i < n; ++i) { 94 cin >> sort_c[i]; 95 } 96 sort_s(0, n-1); 97 for (int i = 0; i < n; ++i) { 98 printf("%d ", sort_c[i]); 99 } 100 system("pause"); 101 return 0; 102 } 103 /* 104 6 105 4 2 1 7 2 1 106 */