快速排序

快速排序的基本原理就是取序列中的一个值,使用一定的移动策略,最终使此值左侧小于该值,右侧大于该值,然后以此值为分界点使用前面的方法进行分治。下面我们直接给出代码,

复制代码
 1 int partition(int table[], int l, int r)
 2 {
 3     int i = l;
 4     int j = r;
 5     int x = table[l];   // x 选取的策略可以变更
 6     while (i < j)
 7     {
 8         // 从最右侧开始查找比 x 小的值
 9         while (i < j && x <= table[j])
10             j--;
11         // 一旦找到,将此值扔到那个最开始取 x 的那个位置上,不过此处就留下了一个位置
12         if (i < j)
13         {
14             table[i] = table[j];
15             i++;
16         }
17         
18         // 从最左侧开始查找比 x 大的值
19         while (i < j && x >= table[i])
20             i++;
21         // 一旦找到,将此值扔到上面留下来的位置上
22         if (i < j)
23         {
24             table[j] = table[i];
25             j--;
26         }
27     }
28     
29     table[i] = x;
30     return i;
31 }
复制代码
复制代码
 1 void quick_sort(int table[], int l, int r)
 2 {
 3     if (l < r)
 4     {
 5         int i = partition(table, l, r);
 6         // i 的左右两侧进行分治
 7         quick_sort(table, l, i-1);
 8         quick_sort(table, i+1, r);
 9     }
10 }
复制代码

可见最终要的过程为上面的 partition 方法,下面就此描述下这个过程,

1.下面是 table 的初始状态,蓝色代表 i 的位置,红色代表 j 的位置

2.执行 9~16 行

3.执行 19~26 行

4.执行 9~16 行

5.执行 19~26 行

6.执行 9~16 行(i == j)

7.执行 29 行

8.返回下标 3

整个过程就是两边向中间逼近,最后把取出来的值放回去。

另外参考值的选取可以使用随机的方法选取,或者取中间的,以应对不同分布的源数据。而且这个算法是递归的,可以在 quick_sort 函数中判断 l 和 r 距离不是很大时采用其他非递归的排序算法,如插入排序或者冒泡排序,避免递归过深。

posted @   WendellYih  阅读(185)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示