插入排序和冒泡排序对比(顺序排序和冒泡排序一样么)

createh53周前 (05-04)技术教程8

插入排序和冒泡排序都是经典排序算法,二者有什么区别呢?

1、如何分析一个排序算法?

分析排序算法已经成为我们衡量一个算法优良的重要标准,从以下三个方面入手。

1.1、 时间效率

这里所谓的实践效率就是时间复杂度。复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。对于时间复杂度的分析,要把最好时间复杂度、最坏时间复杂度、平均时间复杂度分析出来,分别对应了排序算法的最好排序情况、最坏排序情况以及平均排序效率。

1.2、 空间消耗

所谓的空间消耗对应的是空间复杂度,在排序算法中需要开辟的额外内存空间是多少。如果空间复杂度为 O(1),此时该排序叫做原地排序。

注意:是额外的内存空间,存储排序数据消耗的空间不计。

1.3 、稳定性

算法的稳定性虽然我们之前接触的很少,但是稳定性也是衡量一个排序算法的重要标准。什么是稳定排序呢?比如有一组有重复待排序的数据,排序前后,重复的数据顺序不变,此时该排序为稳定排序。否则,叫做不稳定排序。它在实际应用中非常重要的,今天我们就不多说,以后会慢慢分享到。

2、什么是插入排序?

插入排序就是通过插入的方式来排序呗,如将打乱的扑克牌作为未排序区间,手中已经排好序的作为排序区间,每次摸牌的过程称为插入排序。

3、如何实现插入排序?

插入排序的概念已经理解了,那么给你一组数据,如何来进行插入排序呢?

首先要将数据划分为两个区间,已排序区间和未排序区间。

从未排序区间取出数据和已排序区间的数据进行比较,如果小于已排序区间的数据,那我们就交换数据。如果交换到已排序区间数据不在大于插入的数据,然后将元素插入进去。

最后我们看一下代码实现。

4、插入排序的性能

通过上边的对插入排序的拆分讲解和动画以及代码实现,想必你手写一个插入排序可以轻轻松松写出。但是在实际项目中,还要考虑插入排序的性能怎么样?因为才能更好的选择适当排序应用到项目中去。

4.1 、插入排序的稳定性

再插入排序中,如果存在重复数据的话,前边的元素再插入的过程永远在第二个重复数据的前边,所以插入排序后的重复数据前后顺序不变,所以插入排序是稳定排序算法。

4.2、 插入排序的空间消耗

插入排序的移动方式,需要消耗常量级的额外内存空间存储,也就是代码中的 temp,所以时间复杂度为 O(1),我们上边讲到,空间复杂度为O(1)的是原地排序算法。

4.3 、插入排序的时间效率

插入排序的最好情况就是不需要搬移任何数据,从头到尾寻找插入数据,每次只比较一次即可,即一组有序数据,所以最好时间复杂度为O(n)。如果一组数据正好是倒序输出,那么每次都需要比较移动所有数据,每次移动时 n,n 个数据时间复杂度为O(n^2)。对于插入排序的平均时间复杂度,每次插入都要移动数据,插入 n 次,所以平均时间复杂度为 O(n^2)。

5、总结

插入排序和冒泡排序哪个更好呢?

在元素移动次数上进行分析,如果一组无序的数据通过冒泡排序排好序之后,它的交换次数是这种数据的逆序度;对于插入排序来说也是一样的,移动次数上都是原本数据的逆序度。

元素的移动次数是相同的,那看看元素的交换次数。从代码上分析可以明显看出,冒泡排序的一次交换需要三行代码,而插入排序的交换却需要一行,所以总的交换次数冒泡排序大于插入排序。

可能会问,这两行的差别有那么大吗?移动一次,可以不计较,如果数据很多,想想下,两者的效率差别很轻易的就比较出来了。虽然冒泡排序的时间复杂度和插入排序的时间复杂度是相同的,但是我们实际使用中还是优先选择插入排序。

如果觉得写的有帮助,欢迎评论!

相关文章

C++ 初学阶段-冒泡法排序(c++冒泡排序模板)

C++ 初学阶段-冒泡法排序(c++冒泡排序模板)

#头条创作挑战赛#学程序重要的思维,冒泡法排序冒泡法排序,从第一个数值开始分别与后面的数值对比大小。大与就互换位置,直到换到最后一个数字。排序前数组:10,47,3,82,55,90,38,60,21...

冒泡、插入、选择排序(C语言)(c语言冒泡排序需要注意什么)

以下排序算法默认从小到大的升序排序。冒泡排序思路从数组的第一个数a[0]开始,向后遍历,每次比较a[i]和a[i+1]的值若a[i]大于a[i+1],就交换两个位置的数的值。重复上述1和2的操作至a[...

常用排序算法:冒泡排序,快速排序

在生活中,我们离不开排序。例如上体育课时,同学们会按照身高顺序进行排队;又如每一场考试后,老师会按照考试成绩排名次。在编程的世界中,应用到排序的场景也比比皆是。例如当开发一个学生 管理系统时,需要按照...

Python | 数据结构 - 冒泡排序和选择排序

排序算法比较排序算法平均时间复杂度最坏时间复杂度空间复杂度是否稳定冒泡排序O(n2)O(n2)O(1)是选择排序O(n2)O(n2)O(1)不是插入排序O(n2)O(n2)O(1)是希尔排序O(n1....

冒泡排序算法(冒泡排序算法代码)

冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,一次比较两个元素,并且如果它们的顺序错误就交换它们。重复地进行这个过程直到整个列表都是有序的。以下是用C语言实现冒泡排序算法的示例代码:#inc...