冒泡排序和插入排序之间的区别

相信大部分人第一个学的排序就是冒泡排序,但真正应用时,可能会误写成插入排序。算法

由于这两种排序算法实在太像了,简直就是亲兄弟。学习

 

算法名称  最差时间复杂度  平均时间复杂度  最优时间复杂度  空间复杂度  稳定性优化

冒泡排序    O(N^2)     O(N^2)       O(N)       O(1)      稳定spa

插入排序    O(N^2)     O(N^2)       O(N)       O(1)      稳定code

 

二者在数据上简直一毛同样,只考虑复杂度的话彻底能够互相替代。blog

 

但深究的话,仍是能找出许多不一样:排序

 

打个比方:这是咱们今天的主角小明,他机智勇敢热爱学习乐于助人class

有一天他上体育课,排的是3号位置,老师说:同窗们请用冒泡排序的方法排好队。小明以为本身比2号的小红高,因此互换位置,成为了2号。而后他以为比1号小刚高,因此又互换位置排到了1号。老师说:小明,滚到最后去。最终他成了100号,这就是插入排序。方法

 

插入排序:im

将无序的元素插入到有序的元素序列中,插入后仍然有序

 

for i in 2 to n
    for j in i downto 2
        if array[j - 1] > array[j]
            swap(array[j - 1], array[j])
        else
            break
/*
从小到大排列[2,1,4,3]

第一趟排序:[1,2,4,3] 交换次数:1 比较次数:1
第二趟排序:[1,2,4,3] 交换次数:0 比较次数:1
第三趟排序:[1,2,3,4] 交换次数:1 比较次数:2

从小到大排列[4,3,2,1]

第一趟排序:[3,4,2,1] 交换次数:1 比较次数:1
第二趟排序:[2,3,4,1] 交换次数:2 比较次数:2
第三趟排序:[1,2,3,4] 交换次数:3 比较次数:3
*/

 

冒泡排序:

比较相邻元素,直到序列变为有序为止

for i in 1 to n
    for j in 1 to n - i
         if array[j] > array[j + 1]
             swap(array[j], array[j + 1])
/*
举例:从小到大排列[2,1,4,3]

第一趟排序:[1,2,4,3] 交换次数:1 比较次数:3
第二趟排序:[1,2,4,3] 交换次数:0 比较次数:2
第三趟排序:[1,2,3,4] 交换次数:1 比较次数:1

从小到大排列[4,3,2,1]

第一趟排序:[3,2,1,4] 交换次数:3 比较次数:3
第二趟排序:[2,1,3,4] 交换次数:2 比较次数:2
第三趟排序:[1,2,3,4] 交换次数:1 比较次数:1
*/

 

在代码上看似差异不大,实际上两种排序的交换次数,比较次数和每趟排序后的结果不必定相同

但交换和比较操做通常视为O(1),所以二者时间复杂度相等

 

细心的童鞋会发现:这段冒泡排序的最差时间复杂度是O(N^2)而不是O(N)

由于实际上冒泡排序是能够优化的

for i in 1 to n
    flag = 0
    for j in 1 to n - i
         if array[j] > array[j + 1]
             swap(array[j], array[j + 1])
             flag = 1
         if flag == 0
             end
/*
最差时间复杂度降为O(N)
*/
相关文章
相关标签/搜索