2-路插入排序:
2-路插入排序是在折半插入排序的基础上的改进版,可以减少排序过程中移动记录的次数,但为此需要n个记录的辅助空间。
具体做法是:
- 另设一个和L.r同类型的效组d,
- 首先将L. r[1]赋值给d[1],并将d[1]看成是在排好序的序列中处于中间位置的记录,
- 然后从L.r中第2个记录起依次插入到d[1]之前或之后的有序序列中。
- 先将待插记录的关键字和d[1]的关键字进行比较,若L. r[门. key<d[1]. key,则将L. r[门插入到d[1]之前的有序表中。反之,则将L. r[门插入到d[1]之后的有序表中。
- 在实现算法时,可将d看成是一个循环向量,并设两个指针first和final分别指示排序过程中得到的有序序列中的第一个记录和最后一个记录在d中的位置。具体算法留作习题由读者自己写出。
代码实现:
说明:本博客的代码实现贴近数据结构(C语言版) 课本代码风格,使用抽象数据类型。
项目结构
以下文件代码与折半插入排序时所用相同,为避免大量代码重复此处不再附上。
详情可参考折半插入排序:https://blog.youkuaiyun.com/ZipayYu/article/details/98473203
status.h
ststus.cpp
SequenceListType.h
SequenceListType.cpp
2-路插入排序的实现
/************************************
* 函数名称: TwoWayInsertSort
* 函数说明: 2-路插入排序
* 编写人员: Zipay Yu
* 编写日期: 2019/08/04
* 返回类型: void
* 函数参数: SqList & L
*************************************/
void TwoWayInsertSort(SqList &L) {
int first; //有序序列第一个记录的位置
int final; //有序序列最后一个记录的位置
int i, j;
RcdType d[MAXSIZE]; //将d看作一个循环向量
if (L.length > 0)
{
d[