热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

快速排序里的学问:霍尔与快速排序

霍尔(SirCharlesAntonyRichardHoare)是一位英国计算机科学家,他是著名的快速排序(QuickSort)的发明者。在平均状况下,排序n个项目要Ο(nlogn)次比较,而且通常明显比其他Ο(nlogn)演算法更快。所以它是一个被广泛使用的算法。在一次采访中,霍尔谈到了发明这个算法的背景。

上一篇介绍了排序的本质,还有实现了《算法导论》里的快速排序算法。但是快速排序的算法不是只有一个,我们要一次过把快速排序的好东西都挖掘出来。所以这篇文章,让我们对快速排序溯源,去了解快速排序算法的发明者。

霍尔(Hoare)

霍尔 (Sir Charles Antony Richard Hoare) 是一位英国计算机科学家,他是著名的快速排序 (QuickSort) 的发明者。在平均状况下,排序 n 个项目要Ο(n log n) 次比较,而且通常明显比其他Ο(n log n) 演算法更快。所以它是一个被广泛使用的算法。在一次采访中,霍尔谈到了发明这个算法的背景。

霍尔出生于斯里兰卡。1956年毕业于牛津大学。然后的两年里他在英国皇家海军服役,他的任务是研究俄国的现代军事,并因此开始学习了俄语。结束服役后, 他作为研究生进入莫斯科大学,主攻计算机翻译。在莫斯科学习了一年。在这个时候正好有一家生产小型科学计算机的公司Elliott Brothers在那里举办展览,霍尔为他们做翻译。当他回国后,这家公司立即聘用了他,连面试都免了。他们还增加了他的工资,因为他会俄语。 Elliott Brothers让霍尔设计一个新的计算机语言。但当他偶尔看到了一篇艾伦·佩利的“算法语言Algol 60报告”(Report on the Algorithmic Language Algol 60)后,他立即推荐公司放弃设计一个新的语言而转为实施ALGOL。公司采纳了他的建议。ALGOL是第一个清晰定义的语言,其语法是用严格公式化的方 法说明的。ALGOL语言并没有被广泛的使用,但它是许多现代程序语言的概念基础。对他个人来说,这个项目不仅为他的事业奠定了基础,还为他带来了甜蜜的婚姻:他跟同组的同事Jill相识并结婚,成为一段美谈。

言归正传。1960年代,英国国家物理实验室 (National Physical Laboratory) 开始了一项新的计划:将俄文自动翻译成英文。正好霍尔有这个经历,他与俄国的机器翻译专家相识,还在“机器翻译”(Machine Translation) 上发表过论文。于是他在那里得到了一份工作。

在那个年代,俄文到英文的词汇列表是以字母顺序存储在一条长长的磁带上的。因此,当有一段俄文句子需要翻译时,第一步是把这个句子的词按照同样的顺序排列。这样机器就可以在磁带上只走一遍就可以找到所有的翻译。霍尔意识到,他必须找出一种能在计算机上实现的排序的算法来。他想到的第一个算法是后人称作“冒泡排序?(bubble sort)”的算法。虽然他没有声明这个算法是他发明的,但他显然是独自得到这个算法的。他很快放弃了这个算法,因为它的速度比较慢。用计算复杂度理论(Computational complexity theory) 来说,它平均需要?O(n2)?次运算。快速排序?(Quicksort) 是霍尔想到的第二个算法。这个算法的计算复杂度是?O(nlogn)?次运算。当?n?特别大的时候,显然步骤要少很多。这个算法是二十世纪七大算法之一,而他本人则被称为影响算法世界的十位大师之一。霍尔自己则认为这个算法是他一生来得到的唯一一个有意义的算法。显然他是谦虚了。太谦虚了!他在计算机语言和数理逻辑上建树颇多。比如,黄富强老师介绍过霍尔逻辑?(Hoare logic)。当时就说我也要写一篇介绍霍尔的文章,没想到竟然拖到现在。

计算机历史博物馆真是一个好去处。还记得我以前写的“建造一架150年前设计的差分机”吗?也是在那里看到的。北京师范大学数学系的王世强教授和沈复兴教授等对“计算复杂度”有一定的研究。我也是从他们那里第一次接触到“计算复杂度”这个问题的。

回到“快速排序法”,其实“快速排序法”的基本思想是用递归 (Recursion),每进行一步都将一个大的集合划分为两个小的子集,然后对两个子集实施相同的算法。当两个子集都完成了排序之后再把它们重新粘合到一起。让我们用下面的一个简单例子简单说明一下。

假定我们有一组10个数,我们希望将它们从小到大排列。
我们首先从数列中随机挑出一个元素,称为 "基准"(pivot)。
我们把比这个基准小的数放在左边,把比这个基准大的数放在右边。

上面是我们的第一步。在这一步之后,我们得到了两个小的集合。现在我们重复上面的步骤对这两个小的集合进行排序。这就是我前面说的递归的思想。让我们忽略里面的具体细节。经过一些步骤之后,我们已经将这两个小的集合排好序了。下面的两步就容易理解了。

我把这段故事写出来,希望软件工程师们在学习计算方法时得到一些乐趣。也希望上面的故事和这个小例子能对大家有所帮助。

后注:1991年,杨正瓴老师发现了平均复杂性为 O(nloglogn)的自适应排序算法,以及对独立同分布随机数最坏时间几乎处处为O(n)的排序算法。

延伸阅读

此文章所在专题列表如下:

  1. 快速排序里的学问:从猜数字开始
  2. 快速排序里的学问:再看看称球问题
  3. 快速排序里的学问:信息熵
  4. 快速排序里的学问:快速排序的过程
  5. 快速排序里的学问:霍尔与快速排序
  6. 快速排序里的学问:霍尔快排的实现
  7. 快速排序里的学问:枢纽元选择与算法效率
  8. 快速排序里的学问:随机化快排

本文地址:http://www.nowamagic.net/librarys/veda/detail/2391,欢迎访问原出处。


推荐阅读
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 程序员妻子吐槽:丈夫北漂8年终薪3万,存款情况令人意外
    一位程序员的妻子在网上分享了她丈夫在北京工作八年的经历,月薪仅3万元,存款情况却出乎意料。本文探讨了高学历人才在大城市的职场现状及生活压力。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • Valve 发布 Steam Deck 的新版 Windows 驱动程序
    Valve 最新发布了针对 Steam Deck 掌机的 Windows 驱动程序,旨在提升其在 Windows 环境下的兼容性、安全性和性能表现。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 在 Windows 10 中,F1 至 F12 键默认设置为快捷功能键。本文将介绍几种有效方法来禁用这些快捷键,并恢复其标准功能键的作用。请注意,部分笔记本电脑的快捷键可能无法完全关闭。 ... [详细]
author-avatar
轩轩20110804
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有