《算法导论》学习记录目录

快速排序,对于n个数的输入数组,最坏情况运行时间:Θ(n^2);期望运行时间:Θ(nlgn);就地排序(Sort in place)。

数组A[p..r]会被分为两个子数组A[p..q-1]和A[q+1..r],其中A[p..q-1]的元素都不大于A[q],A[q+1..r]都不小于A[q]。

如何划分子数组对运行时间的有很大影响,最坏的情况为n个数的数组划分为一个n-1的数组和一个0元素的数组;最佳情况为对半分(1:1);对于平均情况的划分,其运行时间与最佳情况很接近。

先看代码实现:

快速排序的关键是数组划分,对子数组进行就地重排。

 1 /*
 2  * 调用划分函数,使得子数组顺序重排
 3  */
 4 void quick_sort(int A[], int p, int r){
 5     if(p < r){
 6         int q = partition(A, p, r);
 7         quick_sort(A, p, q-1);
 8         quick_sort(A, q+1, r);
 9     }
10 }
11 
12 /*
13  * 对于比x值小的元素通过交换放置到小于x值的区域。
14  * 最后将大于x值的区域的第一个元素与x值,即原A[r],交换
15  * 该下标即为q,形成两个符合要求的数组(A[p..q-1]的元素都不大于A[q],A[q+1..r]都不小于A[q])
16  */
17 int partition(int A[], int p, int r){
18     int x = A[r];
19     int i = p - 1;
20     int j;
21     for(j = p; j <= r-1; j++){
22         if(A[j] <= x){
23             i++;
24             int temp = A[i];
25             A[i] = A[j];
26             A[j] = temp;
27         }
28     }
29     int temp = A[i+1];
30     A[i+1] = A[r];
31     A[r] = temp;
32     return i+1;
33 }
View Code

相关文章:

  • 2021-08-30
  • 2021-07-03
  • 2021-04-29
  • 2021-07-04
  • 2021-04-16
  • 2021-06-12
  • 2021-11-11
  • 2022-12-23
猜你喜欢
  • 2022-01-20
  • 2021-06-29
  • 2021-06-01
  • 2021-11-29
  • 2021-12-17
  • 2021-10-23
相关资源
相似解决方案