一、快速排序算法步骤:(从小到大排序)

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 */
View Code

相关文章:

  • 2021-11-20
  • 2021-08-04
  • 2021-05-29
  • 2022-12-23
  • 2021-11-30
  • 2021-10-19
  • 2021-07-17
  • 2021-12-15
猜你喜欢
  • 2022-12-23
  • 2021-08-06
  • 2021-11-20
  • 2021-09-22
  • 2021-11-20
  • 2022-12-23
  • 2021-04-04
相关资源
相似解决方案