聊一聊插入排序和比较排序

简介

插入排序和比较排序是排序算法中比较基础和简单的两种,其时间复杂度均为O(N^{2}),在分析算法时间复杂度时,我们往往会只会分析比较开销,但是交换开销也确实存在。这里我将综合比较开销和交换开销,来分析一下插入排序和比较排序的区别,以及何时选择插入排序?何时该选择比较排序?

我之前的文章 排序算法详解 里给出了几个基本排序算法的JavaScript版本实现,感兴趣的也可以移步。

空间复杂度

插排和选排的均在交换时使用了一个临时空间,其空间复杂度均为O(1)。而且插排和选排在排序时同时维护了一个已排序的有序列表和一个待排序的无序列表,不同在于:

  • 插排从无序列表中取第一个数,与有序列表的数依次比较,有序列表的已排数据的位置均可能发生变化。
  • 选排从无序列表中取最小数,只和无序列表中第一个数交换,此时无序列表第一个数归于有序列表(相当于最后一个数)。

在每一轮排序过程中,均需要有一个临时空间用来存储无序列表提取的这一个数,用于未来的交换。

时间复杂度

众所周知,插排和选排的时间复杂度均为O(N^{2})。我们在分析时间复杂度的时候,其实都是分析的比较时间复杂度,但是计算机做算法的时候除了比较,还有交换,并不是说交换时间复杂度不重要,而是它大部分情况相对于比较复杂度可以忽略,至于原因,接下来结合比较和交换开销,来分析插排和选排,自然就明白了。

比较复杂度对比

  • 插入排序

    • 最差情况:最差情况下反向有序,每一轮插入,都需要依次比较到有序列表的第一个数,第一轮比较0次,第二轮比较1次,第N轮比较N-1次。一共比较\frac{N \times (N-1)} {2}次,复杂度O(N^{2})

    • 最好情况:最好情况下有序,每一轮插入,都只需要比较1次,一共比较N次,复杂度O(N)

    • 平均情况:平均情况下,每一轮插入,假设依次比较到有序列表的中间位置,一共比较\frac {N \times (N-1)} {4}次,复杂度O(N^{2})

  • 选择排序

    选择排序比较次数是固定的,每一轮都需要从待排序的无序列表中选取一个最小(或最大)的数,选取中都需要比较到最后一个元素才能得到结果。第一轮比较N-1次,第N轮比较0次。一共比较\frac {N \times (N-1)} {2}次,复杂度O(N^{2})

因此可以得出结论:在最差情况下,两者复杂度一样。在最好情况下,两者复杂度差异是比较大的(1个次方),而在平均情况下,插排的比较次数也只是选排的一半。这也是关于插排和选排的通用结论,一般情况下插排优于选排,主要就在于插排是插入有序列表,而选排是需要在无序列表中选择一个最大值(或最小值),想象一下我们斗地主摸牌,摸到一张牌我们是可以马上从小到大判断插入到哪的(这里假设只能从小到大比较),而不必每一张牌都对比一下。

但是上面的结论只讨论了比较复杂度,其实在为什么说平均情况下,插入排序比选择排序快? - 莫涛的回答 - 知乎
Stack Overflow上,也有人对这种回答中不谈交换表示疑惑,下面我们再来分析一下交换复杂度。

交换复杂度对比

  • 插入排序

    • 最差情况:每一次比较完都需要交换。第一轮交换0次,第二轮交换1次,第N轮交换N-1次。一共交换\frac{N \times (N-1)} {2}次,复杂度O(N^{2})

    • 最好情况:每一次比较完都无需交换,总共交换0次,复杂度O(0)

    • 平均情况:每一轮都插入到中间位置,总共交换次数为\frac{N \times (N-1)} {4}次,复杂度O(N^{2})

  • 选择排序

    • 最差情况:每一轮都需要交换,总共交换N次,复杂度O(N)

    • 最好情况:每一轮都无需交换,总共交换0次,复杂度O(0)

    • 平均情况:有一半轮次需要交换,总共交换\frac N 2次,复杂度O(N)

交换复杂度的对比中我们可以得出:最好情况下两者都无需交换,然而在最差和平均情况下,插入排序的交换次数都高于选择排序,差异为一个次方。可以看出差异还是很大的,单从这样来看,是无法忽略其影响的。

影响时间复杂度的其他因素

其实,在《算法导论》一书中还提到了一个算法性能分析依赖的以下要素:

  1. 待排项数
  2. 这些项已排序程度
  3. 项值的限制
  4. 计算机体系结构
  5. 使用的存储设备种类(主存,磁盘或磁带)

回到这个例子中,我们可以假设忽略硬件的影响、项值无限制。而已排序程度随机(也就是选用平均复杂度,不过一般算法分析都采用最坏情况下的复杂度作为瓶颈进行分析),因此分析要素只剩下待排项数N,可以使用上面的分析给出结论。

结论

插入排序和比较排序谁更优?主要在于比较开销和交换开销的量级:

  1. 如果两者量级相当,则插入排序优于选择排序

  2. 如果比较开销量级小于交换开销,则选择排序优于插入排序

  3. 如果比较开销量级大于交换开销,如果差别不大则难以比较,如果差异较大,则可以忽略交换复杂度,此时插入排序优于选择排序

事实上,交换一般直接交换内存地址(指针)而不是交换真实的数据,而比较则需要CPU的一些运算。这里的一个回答便给出了自定义赋值函数,如果直接交换数据,当数据量过大,交换开销大大增加,此时插入排序反而不如选择排序,因为其交换次数平均情况下和选择排序不在一个量级。

当然,由于交换排序进行了过多的交换次数(也就是写操作),如果使用Flash Memory,则需要额外注意,因为Flash Memory的擦除次数有限,过多的写操作会消耗其擦除次数,从而消耗Flash Memory的寿命。

总结 & 参考

一般情况下,插入排序确实优于选择排序,但也有需要注意的点,而不单单是只判断比较复杂度那么简单。需要我们了解清楚再做判断。

文章参考了以下资料:

  1. Insertion Sort vs. Selection Sort

  2. 为什么说平均情况下,插入排序比选择排序快? - 知乎

  3. When should one use Insertion vs. Selection sort?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343