- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
更快排序
更快的排序
When sorting needs to be faster
引言
在前一章当中,我们已经学习了三种排序方法的工作原理
插入排序
选择排序
冒泡排序
尽管它们在不同的条件下会有不同的表现,但是总的来说,三种算法需要的时间相差无几
2
概要
这一章我们将介绍三种更快的排序方法
快速排序
归并排序
排序网络
前两种方法拥有更高的执行效率,在运行速度上优势惊人
最后一种方法涉及到计算机中很重要的一个概念——并行化
3
快速排序
对于处理大量待排序对象的工作来说,快速排序(Quicksort)无疑是最佳选择
快速排序算法是由Tony Hoare设计的
对一百万个对象进行排序,使用快速排序法比冒泡排序法要快将近20000倍
我们将继续上一章中用到的重物和天平的例子来描述其工作原理
4
快速排序
第一步,任选一个重物,将其放置在天平的一端
第二步,将剩下的所有重物依次和这个重物进行对比,将较轻的放在你的左边,较重的放在右边
在所有重物分成两组后,将之前选取的重物放在两组之间
5
快速排序
第一阶段的一种可能的比较结果如下图第一行所示,两组对象中分别包括重量小于50的一组和重量大于50的一组
6
快速排序
一开始被选出的重物我们称它为“基准”(pivot)
基准(上图第一行中的50)在最后排好序的序列中已经处于了正确的位置——它的左侧有4个比它小的重物,右侧有3个比它大的重物
我们不需要再对基准做任何操作,只要把基准两侧的对象再进行排序即可
7
快速排序
在对基准两侧的对象再进行排序时,我们采用的仍然是之前的方式
选择其中的一组,然后重复上述“分裂”的过程,即在该组中随机选出基准对象再将组中剩余的对象“分裂”成两组,比基准对象轻的放左边,比基准对象重的放右边,基准对象放中间
对另一组也进行同样的处理
8
快速排序
如下图所示的第二行,即是第二轮排序后的情况,其中左边一组的基准为20,右边一组的基准为60
9
快速排序
接下来只剩下两组只含两个对象的序列需要再次排序了,而其他的对象则已经处于排好序的状态
对剩下的各组进行同样的操作,直到每组中只有一个对象
当所有组都拆分成单项时,重物序列也完成了从最轻到最重的排序
10
实践与思考
假设有8个重物,使用快速排序法对其进行排序,记录一共比较了多少次
你觉得最多需要多少次比较?
最多的比较次数发生在怎样的情形下?
你觉得最少需要多少次比较?
最少的比较次数发生在怎样的情形下?
针对这样的情形,你觉得快速排序性能的关键在于什么?
11
快速排序
在快速排序中,我们用到了递归(recursion)的原理,即不断用相同的原则将序列划分成越来越小的部分,并采用相同的步骤对各部分排序
实际上,这种特殊的递归法被称为分治(divide and conquer),序列被不断分割知道它足够小到能够直接导出结果
未来的章节我们会进一步学习分治的思想
12
快速排序的伪代码
procedure Quicksort(List)
if (List少于一个元素) then
(退出并报告排序完毕)
选择基准pivot
分割 (Split) List 使得
List[first]…List[splitPoint-1] = pivot
List[splitPoint] = pivot
List[splitPoint+1]…List[last] = pivot
递归调用 Quicksort ( List[first]…List[splitPoint-1] )
递归调用 Quicksort ( List[splitPoint+1]…List[last] )
13
快速排序的伪代码
procedure Split(List)
pivot ← List[first]
left ← first + 1
right ← last
while (left = right) do
while (List[left]pivot且left = right) do (右移left)
while (List[right]pivot且left = right) do (左移right)
if (leftright) then
(交换List[left]与List[right])
splitPoint ← right
交换List[first]与List[right]
14
快速排序的例子
15
快速排序的例子
16
归并排序
归并排序(Merge sort)是建立在归并操作上的排序算法,它同样体现了“分治”的思想
17
归并排序
首先,将待排序序列随机分成两组且对象数量相同(如果总数为奇数,则应让两组数量尽量接近)
然后,分别对两组对象进行排序,再将两组对象归并起来
归并两个已排好序的序列很容易,你只要不断地移出两组对
您可能关注的文档
- 《赢在形象—职场人士商务礼仪》第二讲:商务礼仪之仪礼篇(一).docx
- 《妈妈账单》PPT课件.ppt
- 【简历】HR认为出色的简历.pdf
- 一个很成功商业项目策划方案.doc
- 一个简便合成二茂钛二芳氧基和水杨酸配合物方法.pdf
- 一个有梦想班主任(10年市级德育讲座).ppt
- 一位非常牛逼前辈的高考经验.docx
- 一份详细大学生创业计划书模板.doc
- 一位妈妈写给叛逆孩子一封书信!.docx
- 【陌上初薰】一份很有创意简历模板.ppt
- 分析let s单元56ago2卷纸zheng unit56.pdf
- 塑胶材料其它分类原料pa9t 12.pdf
- md16x16数字媒体切换器设备.pdf
- 者参考项目发起人学科类型单位序列承包商修订页代码顺序典型.pdf
- 届世界天然气大会阿姆斯特丹2006add10288.pdf
- 期测试记录表每周weekly g1g6 journeys tests level 6 lesson26.pdf
- modernize-whitepaper现代化您应用程序白皮书.pdf
- anybackup产品典型案例分析.pdf
- 约克金融工程课程tfeslide32.pdf
- 广州市妇女儿童医疗中心历份教学药历01tjy.pdf
文档评论(0)