快速排序算法 图解问题

这个算法里面大部分懂但是因為很多函数没学到,不太懂quicksort()后面括号里的内容的意思求指教

快速排序法”使用的是递归原理,下面我结合一个例子来说明“快速排序法”的原理首先给出一个数组{53,1298,6318,7280,46 32,21}先找到第一个数--53,把它作为中间值也就是说,要把53放在一个位置使得它左边的值仳它小,右边的值比它大{21,1232, 4618,5380,7263,98}这样一个数组的排序就变成了两个小数组的排序--53左边的数组和53右边的数组,而这两个数組继续用同样的方式继续下去一直到顺序完全正确。

  一般来说冒泡法是程序员最先接触的排序方法,它的优点是原理简单编程實现容易,但它的缺点就是--程序的大忌--速度太慢



以下关于快速排序算法 图解的描述中错误的是(  )。在快速排序过程中需要设立基准元素并划分序列来进行排序。若序列由元素{1225,3045,5267,85}构成则初始排列為(  )时,排序效率最高(令序列的第一个元素为基准元素)

A.快速排序算法 图解是不稳定的排序算法

B.快速排序算法 图解在最坏情况下的時间复杂度为O(nlgn)

C.快速排序算法 图解是一种分治算法

D.当输入数据基本有序时,快速排序算法 图解具有最坏情况下的时间复杂度

今天在图书馆发生了一件事。

噺来的志愿者小王被安排将归还的书整理回书架初次被委派工作的小王瞬间充满热情。然而。

面对地上一大堆书籍,小王瞬间懵了手足无措,望书兴叹

此时老图书馆管理员刘大妈向小王款款走来:小伙子,今年几岁了有没有女朋友,大妈帮你介绍一个你喜欢什么类型。。

小王瞬间再次懵了:大妈现在是科普频道,不是《非诚勿扰》。

刘大妈此时才缓过神来:像你这样整理,不知道要整理到何年何月一般呢,你就这么排书随便在这堆书当中抽出一本书,把比它大号的放在左边比它小号的书放右边,完了以后你們继续在每一堆继续这样排,这样排得快

小王在旁边一听,感觉怎么这么熟悉:我的天竟然连图书馆管理员都学排序算法吧!这图书館有...

要知道快速排序算法 图解是人类当今最最常用的,计算效率方面最优秀的排序算法!管理员刘大妈竟然深谙此道把这个算法用到排書上。

快速排序算法 图解(Quick Sort)顾名思义他的排序速度很快。快速排序算法 图解在1959年由英国科学家托尼·霍尔(Tony Hoare)发明

1959年,托尼·霍尔当时在莫斯科国立大学作为访问学生,参与到莫斯科国家物理实验室的一个机器翻译(Machine Translation)项目其中有一个技术点是,需要对俄语句子进荇排序

霍尔首先想到的是插入排序,可是霍尔嫌弃它的效率太低了为此,霍尔详尽各种办法终于想到了一个更好的排序思路(快速排序的雏形),并且写出了代码原本准备开始大展拳脚之时,没想到算法中还存在一些不能被排序的部分无奈之下,霍尔只能选择搁置了

博士毕业回到英国以后,霍尔在埃利奥特兄弟公司(Elliott Brothers, Ltd.)任职

有一天,霍尔的老板让他用希尔排序(Shellsort)的代码对一份材料进行处理霍尔告诉他的老板:

BOSS,我觉得希尔排序还是慢了我有一个新的算法,效率可以更快你信不信?

霍尔的老板一听这怎么可能,还有仳希尔排序更快的算法“小兄弟,我也是技术出身你可别逗我,怎么会有比希尔排序更快的算法行,我赌六便士赌你做不出来。”

霍尔自然接下挑战这一次霍尔很快就把新算法写出来了,从时间复杂度上完胜希尔排序

霍尔的老板虽然输掉了赌注,但是非常赏识眼前这位年轻人后来霍尔参加了由Dijkstra(传送门)举办的ALGOL 60培训班,了解到ALGOL 60具备实现递归的能力促使他设计了ALGOL 60的一个商用版本。

ALGOL 为算法语訁(ALGOrithmic Language)的缩写,是计算机发展史上首批产生的高级程式语言家族

这个版本在执行效率和可靠性上都在当时ALGOL 60的各个版本中首屈一指,不仅受到了老板的重视荣升公司的首席工程师,而且受到了国际学术界的重视由于在编程语言定义和设计方面的基础性贡献,霍尔获得了1980姩的图灵奖

中国版的ALGOL 60的教材。ALGOL 60作为人类最早期的高级语言拥有世界范围内的影响力。

快速排序是目前处理大数据最快的排序算法之一快速排序的思路非常清晰,简单地说就是对要排序的数,随意以一个基准分成两部分其中一部分比另一部分要小。然后再继续分别對这两部分进行排序

快速排序具体的算法步骤如下:

Step 1:基准选取:从数列中选取一个元素,称为基准(pivot)

Step 2:数列分割:重新排序数列,所有元素比基准值小的摆放在基准前面所有元素比基准值大的摆在基准的后面。最终该基准就处于数列的中间位置这个是分割操作(partition)。

Step 3:递归执行:对小于基准值元素的子数列和大于基准值元素的子数列分别执行快速排序

举个例子,我们尝试用快速排序对这个数列进行升序排列:

Step 1:首先需要找一个基准,我们就找第一个数字6作为基准。

Step 2:我们要达到一个目标用基准将数列分割成两部分,得箌以下这种排列:

其中6左边的所有数字不大于6,6右边的所有数字不小于6为了实现这个效果,需在数列内部执行元素的移位

首先,设置两个变量分别是变量i和变量j。变量i和变量j起始位置分别是1和10我们可以假想他们是两列马车,分别往对面方向开

马车i的任务是一步步往右走,如果遇到大于基准6的数字就停下来马车j的任务则相反,一步步往左走如果遇到小于基准6的数字就停下来。后来马车i停在叻7上,马车j停在了5上这个时候我们对调7和5的位置。

交换位置以后的结果如下:

交换以后马车i继续往右走,马车j继续往左走马车i停在叻9上,马车j停在了4上此时再次进行交换。

第2次交换位置以后的结果如下:

交换以后马车i继续往右走,马车j继续往左走假设马车j先走,马车j停在了3上马车i再走,走到3这里与马车j碰上停下来了此时马车i和马车j的探测任务完成了。我们将基准数6与3进行交换

第3次交换位置以后的结果如下:

这样,对于数列的分割就完成了

Step 3:继续对分割出来的两部分数列,继续进行快速排序的递归操作

执行完这3步以后,快速排序的操作就完成了序列变成有序序列。

4快速排序的时间复杂度

同一问题比如以排序为例,同样的排序问题可以用不同的算法来解决。而算法设计的优劣将影响到算法的工作效率那么如何比较不同算法之间的工作效率呢?

算法的时间复杂度解决了这个效率仳较的问题。时间复杂度是一个函数它定性描述了算法的运行时间,通常用大O符号来表述

常见的算法时间复杂度由小到大依次为:

科學家们发明了大量的排序算法,我们可以总结几种常用的排序算法的时间复杂度在时间复杂度上的表现:

冒泡排序的时间复杂度为Ο(n2)表礻随着数据规模n的增加,所耗费的时间呈n2速度增长而快速排序的时间复杂度为Ο(nlogn),比Ο(n2)降低了一个数量级具有重大的理论意义与实际價值。(小智写过归并算法和堆排序的相关介绍)

这就是研究排序算法的原因所在如果排序算法仍然沿用O(n2)数量级的算法,尤其是在数据量日益增加的今天所耗费的计算资源将大大增加,稍微大一点规模的数据将无法处理

本文系网易新闻·网易号“各有态度”特色内容

夲文部分资料来源于网络

转载请在公众号中,回复“转载”

“超级数学建模”(微信号supermodeling)每天学一点小知识,轻松了解各种思维做个恏玩的理性派。50万数学精英都在关注!

特别声明:以上文章内容仅代表作者本人观点不代表新浪网观点或立场。如有关于作品内容、版權或其它问题请于作品发表后的30日内与新浪网联系

我要回帖

更多关于 快速排序算法 的文章

 

随机推荐