《Algorithms》摘录评注之叁:基本排序

本笔记基于ROBERT SEDGEWICK & KEVIN WAYNE开设的《Algorithms》课程,同时配有同名教材。
slides本身内容丰富详实,所以我会先甄选出重点的篇幅整理出来并做简单批注,后续会添上对应算法题的演示。

0.排序的基础:

通过对两个元素进行大小比较(小于、等于或者大于),返回不同的结果。
image_1ansqmelvr6j105h5jcjeflca1g.png-141.7kB
比较后进行两步处理:①第一个元素是否比第二个元素小(是的话返回-1)②(满足条件下)两者进行交换
image_1ansqn3idn6g61n12pb15931jai2a.png-49.3kB

1.选择排序

实现过程:①从左(第1个元素开始)到右遍历整个数组,找出当前整个数组最小的元素并放到最左边;②继续遍历整个数组(从第2个元素开始,第1个元素的位置在①中已被最小元素固定,所以不用管)找到(整组中)第2小的元素(即剩下数组元素中最小的),放在左起第2个位置;③重复直至整个数组排序完成

算法复杂度:由于每次都要遍历当前剩下的整个数组,所以需要比较
(N – 1) + (N – 2) + … + 1 + 0 ~ N ² / 2 次,交换N次
image_1ansqobr3sd15sh1pcgk691qs534.png-148.3kB
image_1ansqofjakjqfntlb71rclcfi3h.png-115.5kB

2.插入排序

每次都要从(当前的)头开始遍历,很麻烦,改进一下。
实现过程:从右边开始入手,只要当前的元素比左边的元素小,就跟左边交换,循环往复。

算法复杂度:对于一个随机的数组,平均来看,有一半的元素是已经按从小到大排序好的(不一定连在一起,可以混在没有排序好的元素中间),所以跟之前的选择排序相比,少做一半的比较,(对于选择排序来说,元素怎么排都不影响,它总是机械死板地从头开始遍历整个数组)那么算法复杂度也是选择排序的一半了,即N ² / 4次 。
image_1ansqppdlkch1gtvr42odm1ngd4b.png-61.4kB
image_1ansqpv4p1cmn1cl1fmf1i0ml994o.png-117.8kB
image_1ansqq35s19ur1kq82q113s94s55.png-62.5kB
插入排序在已经部分排序好的数组里的表现:
image_1ansqqhs01d6d1mdm1i2ujln4u25v.png-59.6kB

3.Shellsort (Shell是发明这个算法的人的名字)

插入排序比选择排序有进步,但它也有犯傻的时候,比如在右边的某个元素命名比前面7个元素都要小,但我们却要眼睁睁地看着这个元素连续与左边交换7次。聪明的你们想到了,直接一步到位,交换7个位置嘛!然后再每隔3个元素进行比较交换,再回到最基本的对每个元素进行比较交换,这就是Shellsort
image_1ansqrt5suq71abp2f81o2fh8p79.png-72.3kB
image_1ansqs7s317bjfmeuuk116cg177m.png-148kB
当然,那到底从每隔几个元素进行操作开始呢?这个间隔规律也是个数学问题,目前并没有一个严密的数学模型可以求得最优解,在这里介绍一个比较简单易用的:3x+1
image_1ansqsnor1tju1giv28guipc9a8g.png-130.8kB

每篇文章除特殊声明外均以 CC BY-NC-SA 4.0 协议发布,非商业用途可以在保留署名和来源的情况下任意转载。