2-路插入排序

来源:互联网 发布:无线耳机推荐 知乎 编辑:程序博客网 时间:2024/05/29 12:54
 

是对折半插入排序的改进,以减少排序过程中移动记录的次数。附加n个记录的辅助空间,方法是:

①  另设一个和L->R同类型的数组d,L->R[1]赋给d[1],将d[1]看成是排好序的序列中中间位置的记录;

②  分别将L->R[ ]中的第i个记录依次插入到d[1]之前或之后的有序序列中,具体方法:

◆ L->R[i].key<d[1].key: L->R[i]插入到d[1]之前的有序表中;

◆ L->R[i].key≥d[1].key: L->R[i]插入到d[1]之后的有序表中;

关键点:实现时将向量d看成是循环向量,并设两个指针first和final分别指示排序过程中得到的有序序列中的第一个和最后一个记录。

 

排序示例

设有初始关键字集合{49, 38, 65, 13, 97, 27, 76} ,采用2-路插入排序的过程如右图10-3所示。

在2-路插入排序中,移动记录的次数约为n2/8 。但当L->R[1]是待排序记录中关键字最大或最小的记录时,2-路插入排序就完全失去了优越性。

 

表插入排序

前面的插入排序不可避免地要移动记录,若不移动记录就需要改变数据结构,附加n个记录的辅助空间。

记录类型修改为:

typedef struct  RecNode

         KeyType  key ;

         infotype  otherinfo ;

         int *next;

}RecNode ;

初始化:下标值为0的分量作为表头结点,关键字取为最大值,各分量的指针值为空;

① 将静态链表中数组下标值为1的分量(结点)与表头结点构成一个循环链表;

② i=2 ,将分量R[i]按关键字递减插入到循环链表;

③ 增加i ,重复②,直到全部分量插入到循环链表。

 

例:设有关键字集合{49, 38, 65, 97, 76, 13, 27, 49} ,采用表插入排序的过程如下图10-4所示。

和直接插入排序相比,不同的是修改2n次指针值以代替移动记录,而关键字的比较次数相同,故时间复杂度为O(n2)。

 

原创粉丝点击