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)。
- 插入排序--2路插入排序
- 插入排序之2路插入排序
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- //插入排序 直接插入排序 二分插入排序 2-路插入排序 表插入排序 希尔排序
- 2路插入排序
- 2路插入排序
- 2路插入排序
- 2-路插入排序
- 2-路插入排序
- 2-路插入排序
- 2-路插入排序
- 2路插入排序
- 2-路插入排序
- 2-路插入排序
- 插入排序(直接插入排序,折半插入排序,2路插入排序)
- 排序3:插入排序(2路插入排序)
- 直接插入排序,折半插入排序,2-路插入排序,希尔排序
- Linux int型转换为char*型
- B_树(多路平衡查找树)
- B+树
- 哈希(散列)查找
- 直接插入排序
- 2-路插入排序
- 希尔排序
- SQL触发器的使用及语法
- 冒泡排序
- 简单选择排序
- 堆排序
- Java中的IO流知识总结
- MySQL的正则表达式应用
- SQL和EXCEL和ACCESS之间的关系