为什么插入排序比冒泡排序更受欢迎

栏目: 编程工具 · 发布时间: 4年前

内容简介:对于任何一个程序员来说,学习的第一个算法,可能就是排序。最常用的有:冒泡排序、计数排序、插入排序、快速排序、选择排序等。 其中:冒泡排序、插入排序、选择排序的时间复杂度为O(n^2),且是思考:插入排序和冒泡排序的时间复杂度相同,都是O(n2),在实际的软件开发里,为什么我们更倾向于使用插入排序算法而不是冒泡排序算法呢?学习排序算法,除了学习他的算法原理、代码实现之外,更重要的是要学会如何评价、分析一个排序算法。分析一个排序算法,一般从下面几个方面入手:

对于任何一个 程序员 来说,学习的第一个算法,可能就是排序。最常用的有:冒泡排序、计数排序、插入排序、快速排序、选择 排序 等。 其中:冒泡排序、插入排序、选择排序的时间复杂度为O(n^2),且是 基于比较 的排序算法。

思考:插入排序和冒泡排序的时间复杂度相同,都是O(n2),在实际的软件开发里,为什么我们更倾向于使用插入排序算法而不是冒泡 排序算法 呢?

如何分析一个"排序算法"

学习排序算法,除了学习他的算法原理、代码实现之外,更重要的是要学会如何评价、分析一个排序算法。分析一个排序算法,一般从下面几个方面入手:

排序算法的执行效率

  1. 最好情况、最坏情况、平均情况时间复杂度
  2. 时间复杂度的系数、常数、低阶
  3. 比较次数和交换(或移动)次数(排序算法的内存消耗,排序算法的稳定性)

冒泡排序解析

一、冒泡排序是原地排序算法吗?

冒泡的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,所以它的空间复杂度为O(1),是一个原地排序算法。

二、冒泡排序是稳定的排序算法吗?

在冒泡排序中,只有交换才可以改变两个元素的前后顺序。为了保证冒泡排序算法的稳定性,当有相邻的两个元素大小相等的时候,我们不做交换,相同大小的数据在排序前后不会改变顺序,所以冒泡排序是稳定的排序算法。

三、冒泡排序的时间复杂度是多少?

最好情况下,要排序的数据已经是有序的了,我们只需要进行一次冒泡操作,就可以结束了,所以最好情况时间复杂度是O(n)。而最坏的情况是,要排序的数据刚好是倒序排列的,我们需要进行n次冒泡操作,所以最坏情况时间复杂度为O(n^2)

插入排序解析

一、插入排序是原地排序算法吗?

从实现过程可以明显看出,插入排序算法的运行并不需要额外的存储空间,所以它的空间复杂度为O(1),是一个原地排序算法。

二、插入排序是稳定的排序算法吗?

在插入排序中,对于值相同的元素,我们可以选择将后面出现的元素,插入到前面出现元素的后面,这样就可以保持原有的前后顺序不变,所以插入排序的稳定的排序算法。

三、插入排序的时间复杂度是多少?

如果要排序的数据已经是有序的,我们并不需要搬移任何数据。如果我们从尾到头在有序数据组里面查找插入位置,每次只需要比较一个数据就能确定插入的位置。所以这种情况下,最好的时间复杂度为O(n)。

如果数组是倒序的,每次插入都相当于在数组的第一个位置插入新的数据,所以需要移动大量的数据,所以最坏的事件复杂度为O(n^2).

冒泡排序和插入排序的时间复杂度都是O(n^2),都是原地排序算法,为什么插入排序要比冒泡排序更受欢迎呢?

从前面的分析可以得出:冒泡排序不管怎么优化,元素交换的次数是一个固定值,就是原始数据的逆序度。插入排序是同样的,不管怎么优化,元素移动的次数也等于原始数据的逆序度。

但是从代码实现上来看,冒泡排序的数据交换要比插入排序的数据移动要复杂,冒泡排序需要3个赋值操作,而插入排序只需要1个。

冒泡排序中数据的交换操作
if (a[j] > a[j+1]) { // 交换
    int tmp = a[j]
    a[j] = a[j+1]
    a[j+1] = tmp
    flag = true
}

插入排序中数据的移动操作
if (a[j] > value) {
    a[j+1] = a[j] // 数据移动
}
复制代码

我们把执行一个赋值语句的时间粗略地计为单位时间(unit_time),然后分别用冒泡排序和插入排序对同一个逆序度是K的数组进行排序。用冒泡排序,需要k次交换操作,每次需要3个赋值语句,所以交换操作总耗时就是 3*K 单位时间。而插入排序中数据移动操作只需要K个单位时间。

总结:

所以,虽然冒泡排序和插入排序在时间复杂度上都是一样的,都是O(n^2),但如果我们希望把性能做到极致,那肯定首选插入排序。当然,插入排序的算法思路也有很大的优化空间,因此又出现了 希尔排序


以上所述就是小编给大家介绍的《为什么插入排序比冒泡排序更受欢迎》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Vim实用技巧

Vim实用技巧

[英] Drew Neil / 杨源、车文隆 / 人民邮电出版社 / 2014-5-1 / 59.00元

vim是一款功能丰富而强大的文本编辑器,其代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中得到非常广泛的使用。vim能够大大提高程序员的工作效率。对于vim高手来说,vim能以与思考同步的速度编辑文本。同时,学习和熟练使用vim又有一定的难度。 《vim实用技巧》为那些想要提升自己的程序员编写,阅读本书是熟练地掌握高超的vim技巧的必由之路。全书共21章,包括121个技巧。每一章......一起来看看 《Vim实用技巧》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具