1 #include <stdio.h>
2
3 /**
4 * 快速排序因为是递归的,需要借助一个递归工作栈来保存每层递归调用的必要信息,其容量与递归调用的最大深度一致。
5 * 最好情况下为[log2(n+1)](上取整), 最坏情况下因为要进行n-1次递归调用,所以栈的深度为O(n),平均情况下栈的深度为O(log2n)
6 * 快速排序的平均时间复杂度为O(nlog2n),最坏情况下为O(n^2)[当初始排序表基本有序或基本逆序时]
7 * 故很多方法可以提高快速排序的效率,例如:1.当递归过程中划分得到的子序列的规模较小时不再继续递归调用快速排序,直接采用快速排序
8 * 2.尽量选一个中分的枢轴元素 3.随机选取枢轴元素
9 */
10 int partition(int sz[], int low, int high)
11 {
12 // 将当前表中第一个元素设为枢轴值,对表进行划分
13 sz[0] = sz[low];
14 while (low < high) // 循环跳出条件
15 {
16 while (low < high && sz[high] >= sz[0])
17 high--;
18 sz[low] = sz[high]; // 将比枢轴值小的元素移动到左端
19 while (low < high && sz[low] <= sz[0])
20 low++;
21 sz[high] = sz[low]; // 将比枢轴值大的元素移动到有段
22 }
23 sz[low] = sz[0]; //枢轴元素存放到最终位置
24 return low; // 返回枢轴的最终位置
25 }
26
27 // 快速排序
28 void quick_sort(int sz[], int low, int high)
29 {
30 if (low < high) // 递归跳出条件
31 {
32 int pivot = partition(sz, low, high); // 划分
33 quick_sort(sz, low, pivot - 1); // 依次对两个子表进行递归排序
34 quick_sort(sz, pivot + 1, high);
35 }
36 }
37
38 int main()
39 {
40 // sz[0]作为暂存单元
41 int a[] = {0, 5, 10, 8, 100, 50, -10, 60};
42 // low=1, high=7
43 quick_sort(a, 1, 7);
44 // 输出排序结果
45 for (int i = 1; i < 8; i++)
46 {
47 printf("%d%c", a[i], i == 7 ? '\n' : ' ');
48 }
49 return 0;
50 }