← 返回内容列表

Tony Hoare 与快速排序:一个在电梯里想出来的算法,拿下图灵奖

分享本文
Tony Hoare 与快速排序:一个在电梯里想出来的算法,拿下图灵奖

1960 年,26 岁的 Tony Hoare 在莫斯科为一台俄英翻译机排序句子时,构思出了快速排序。这个"平均最快"的算法让他后来获得了 1980 年图灵奖,也成了算法史上最著名的轶事之一。

1960 年,年轻的英国数学家 Tony Hoare 在莫斯科国立大学做访问学者,参与一台机器翻译设备的开发。他需要把俄文单词按字典序排好,却嫌当时的排序方法太慢。据他本人回忆,灵感来得意外——在一次等待电梯(也有说是坐火车)的时候,他想到了一个"分而治之"的办法:选一个基准值,把比它小的放左边、比它大的放右边,再对两边递归。这就是快速排序

这个想法在 1961 年正式发表,迅速成为算法史上的里程碑。它的美妙在于平均只需 O(n log n),且常数因子极小——在实践中常常比同时代的归并排序还快。代价是:如果每次都选到最坏基准(比如已排序数组选到端点),会退化到 O(n²)。这催生了"随机化快排""三数取中"等工程改良,也引出今天第③篇要讲的比较排序下界。

Hoare 的贡献远不止快排。他还提出了形式化方法(用数理逻辑证明程序正确性)、CSP 并发模型(影响了 Go 语言的 channel 设计),并因这些奠基性工作获得 1980 年图灵奖——计算机界的诺贝尔奖。他有一句名言:"构建软件设计有两种方式:一种简单到没有明显缺陷,另一种复杂到没有明显缺陷。前者要难得多。"

今天,快排的变种仍运行在无数设备的标准库里。一个在异国他乡等电梯时冒出的念头,就这样静静支撑了此后六十年的计算世界。明天我们会在 B3 节点系统拆解快排的分治与分区。

快速排序:选基准 → 分区(小的放左、大的放右)6382915pivot=6分区后3215689左<6pivot右>6再对左右两段递归,即完成快排

图:以 6 为基准的一次分区过程

参考代码(Python)

快排的"分治+分区"思想,下面给出最易读的列表版实现。

def quicksort(a):
    if len(a)  pivot]
    return quicksort(left) + mid + quicksort(right)

关联推荐

评论 (0)

正文划词可点「问萝卜特」——自动发评论并由 AI 回复

加载评论中…