排序算法之——插入类排序

插入类排序的基本思想

在一个已经排好序的有序序列区内,对待排序的无序序列区中记录逐个进行处理,每一步将一个待排序的记录与有序序列区的记录进行比较,然后有序地插入到该有序序列区中,直到待排序的无序序列区处理完毕。

分类

1).直接插入排序(基于顺序查找)

2).折半插入排序(基于折半查找)

3).希尔排序(基于逐趟缩小增量)


直接插入排序

思想:假设记录序列的状态为R[1...i...n],则有序序列区为R[1...i-1],无序序列区为R[i...n],R[i]为无序序列区正在处理的记录。直接插入排序就是利用顺序查找来确定r[i]在有序序列区R[1...i-1]中的插入位置。即:将第i个记录的关键字Ki与前面记录R[1...i-1]的关键字从后向前顺次比较,将所有关键字大于Ki的记录依次向后移动一个位置,直到遇到一个关键字小于或等于Ki的记录,该记录的后面即为R[i]的插入位置。

注意:初始时,R[1]自成1个有序区,无序区为R[2...n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。

平均时间复杂度:O(n^2)。

稳定性:稳定。

代码:

排序算法之——插入类排序_第1张图片

折半插入排序

思想:折半插入排序是利用折半查找来确定r[i]在有序序列区有序序列区R[1...i-1]中的插入位置。

平均时间复杂度:O(n^2)。

稳定性:稳定。

代码:

排序算法之——插入类排序_第2张图片

希尔排序

思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

平均时间复杂度:跟增量的选取有很大的关系。很多情况下“增量每次除以2递减”,时间复杂度为O(n^2)。当按{2k-1,2k-1-1,...,7,3,1}序列取增量时,时间复杂度为O(n^(3/2)),“增量每次除以3递减”也可以达到这种效果。

稳定性:不稳定。

代码:

排序算法之——插入类排序_第3张图片

你可能感兴趣的:(排序算法之——插入类排序)