一、直接插入排序:一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。
例如,已知待排序的一组记录的初始排列如下:
49,38,65,97,76
假设在排序过程中,前4个记录已按关键字递增的次序重新排序,构成一个含4个记录的有序序列:
38,49,65,97
现将第5个记录插入上述序列,以得到一个新的含5个记录的有序序列,则首先要在之前的序列中进行查找以确定76所应插入的位置,然后进行插入,从而得到下列新的有序序列:
38,49,65,76,97
若待排序记录是随机的,即待排序列中的记录可能出现的各种排列的概率相同,则我们可取上述最小值和最大值的平均值,作为直接插入排序时所需进行关键字间的比较次数和移动记录的次数,约为(n的平方)/4。由此,直接插入排序的时间复杂度为O(n2);
2、折半插入排序:由于插入排序的基本操作是在一个有序表中进行查找和插入,则从“折半查找”的讨论中可知,这个“查找”操作可利用“折半查找”来实现,由此进行的插入排序称之为折半插入排序;时间复杂度为O(n2);
折半查找:在查找的过程中,先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。
假设指针low和high分别指示待查元素所在范围的下界和上界,指针mid指示区间的中间位置,即mid = 【(low + high)/ 2】。确定位置后再使用递归循环查找。
3、2-路插入排序:是在折半插入排序的基础上再改进之,其目的是减少排序过程中移动记录的次数,但为此需要n个记录的辅助空间。具体做法是:另设一个和a同类型的数组d,首先将a[1]赋值给d[1],并将d[1]看成是在排好序的序列中处于中间位置的记录,然后从r中第2个记录起依次插入到d[1]之前或之后的有序序列中。