算法|选择排序与插入排序比较

请先参考:选择排序 插入排序

选择排序前面介绍了,对于任何数组而言,他的总的时间复杂度近似为:N2/2, 是随着数组的长度成平方级别的增长的,数组越长,算法的复杂度会成倍的增长.加入数组是完全有序的呢?或者部分有序,那么选择排序依然会对每个元素进行比较,也就是说,选择排序它无法感知到数组的有序特征

如果是插入排序,前面也介绍了:

第一种:数组已经排好序,则只需要N-1次比较就好了,不需要任何交换
第二种:数组逆序,则需要  N 2 /2(等差数列求和)次比较和  N 2 /2次交换,参考  选择排序 ,和选择排序的复杂度相当

第三种:平均情况,有一半有序。则需要 N2/4次比较和 N2/4次交换,也会比选择排序快

插入排序对数组顺序是有感知的,在一个部分有序,或者大多数元素都离最终位置较近的情况下,插入排序显然比选择排序更合适。同样的从 这里 下载的图,能更直观的说明排序过程和性能差别




左边的是插入排序,右边的是选择排序,灰色的是排好顺序的元素,黑色的是未排序的元素。

红色柱子的含义在两个算法里含义不一样,在插入排序中,表示当前要排序的元素,需要给这个红色的元素找到合适的位置插入。

在选择排序中,红色元素表示在内循环中的最小元素,需要按照大小顺序排布在合适的位置上

对于插入排序,以最高的黑色柱子为分界线,左边是排好序的元素,并且元素只会在该柱子左边移动,红色的柱子是从最高的柱子左边依次移动最终到达比他小(第一次)的元素的后面,也就是说,红色的柱子和黑色的最高柱子之间的柱子(元素)都向后移动了位置,这样,红色柱子才能找到合适的位置。

对于选择排序,黑色的元素都是要一一比较的,每次内循环,都会在剩下的未排序元素中,取第一个与其余的依次比较,直到内循环结束,就能找到最小的元素(红色的柱子),然后与第一个元素交换,每次内循环中都会在剩下的元素中找到最小的元素,然后与第i 个元素交换。

上面的图直观的描述了排序的过程。黑色的块和红色的块都是要移动位置和比较的,很明显选择排序要进行的比较和交换明显比插入排序要多,至少是两倍。

可以得出结论,如果完全无序的数组,或者是逆序数组,选择排序和插入排序,性能相当。

但是在部分有序,或者完全有序的数组中,插入排序明显具有优势。

所以在以下情况中适合用插入排序:

①部分元素有序

②一个有序数组+一个无序数组

③大部分元素离最终位置都比较近

用会快很多.

下一篇会介绍 希尔排序,它实际上是插入排序的高级版



猜你喜欢

转载自blog.csdn.net/l491337898/article/details/79878575