5、未曾编写的最美代码:快速排序的深度剖析

未曾编写的最美代码:快速排序的深度剖析

1. 快速排序的选择与应用

当被问到“你所编写的被广泛使用的最美代码是什么”时,答案是快速排序。曾与 M. D. McIlroy 写过一篇文章,指出了 Unix qsort 函数存在的严重性能问题。为构建新的 C 库排序函数,考虑了多种算法,如归并排序和堆排序,最终选定了快速排序算法的一个版本。新函数比其竞争对手更清晰、更快且更健壮,部分原因是代码量更小,印证了 Gordon Bell 的建议:“计算机系统中最便宜、最快且最可靠的组件是那些不存在的组件”,该函数已被广泛使用十多年且无故障报告。

2. 以少胜多:快速排序性能分析

快速排序是一个优雅的算法,适合进行细致分析。1980 年左右,与 Tony Hoare 讨论其算法历史时得知,他最初开发快速排序时认为太简单而未发表,直到能分析其预期运行时间后才撰写经典论文。

快速排序在最坏情况下对 n 个元素的数组排序可能需要约 $n^2$ 时间,最好情况下选择中位数作为分区元素,约需 $n \lg n$ 次比较。那么对于 n 个不同值的随机数组,平均需要多少次比较呢?Hoare 的分析很精彩,但许多程序员难以理解。为解决这个问题,我们从 Hoare 的程序开始进行实验分析。

任务是修改随机化快速排序代码,分析对不同输入数组排序时的平均比较次数,同时尝试用最少的代码、运行时间和空间获得最大的见解。

为确定平均比较次数,先对程序进行扩充以统计比较次数,在内部循环的比较操作前增加变量 comps 的值,代码如下:

for (i = l+1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值