2路插入排序(精)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
final
3 3
final
87
29
29 29
87
64 64
3
final
17
17 17
25
25 25
87 87
3 3Leabharlann Baidu
first
127
•
• • • • •
• • • •
d[first]之前(不需移动d数组的元素)。 { first = (first - 1 + length) % length; d[first] = L[i]; } else if (L[i] > d[final])//待插入记录大于d中最大值, 插入到d[final]之后(不需移动d数组的元素)。 { final = final + 1; d[final] = L[i]; }
if (L[i] < d[first])//待插入记录小于d中最小值,插入到
•
• • • • • • • • • •
else//待插入记录大于d中最小值,小于d中最大值,插入 到d的中间(需要移动d数组的元素)。 { int j = final ++;//移动d尾部元素以便按序插入记录。 while (L[i] < d[j]) { d[(j + 1) % length] = d[j]; j = (j - 1 + length) % length; } d[j + 1] = L[i]; } }
• 2.例10-2。现有17、29、3、87、25、 64、126,7位数字,现对这些数字由大 到小进行排序。
final
• 1 • 17 • (1) • (2) • (3) • • (4) • (5) • (6)
first
2 29 29 29 29
3 3
4 87
5 25
6 64
7 127 17 17 17
• 谢谢大家!!! • 祝大家考试顺利!!!
• 习题 • 现有以下这些数字,进行2-路 排序 • 35、68、12、46、99、103、 80 、99
• 2-路插入排序是在折半插入排序 的基础上再改进,其目的是减少 排序过程中移动记录的次数,但 为此需要n个记录的辅助空间。
• 具体做法:另设一个和L.r同类型的数组d, 首先将L.r[1]赋值给d[1],并将d[1]看成是在 排好序列中处于中间位置的记录,然后从 L.r中第2个记录起依次插入到d[1]之前或之 后的有序序列中。先将待插记录的关键字 和d[1]的关键字进行比较,若 L.r[i].key<d[1].key,则将L.r[i]插入到d[1]之前 的有序表中。反之,则将L.r[i]插入到d[1]之 后的有序表中。在实现算法时,可将d看成 是一个循环向量,并设两个指针first和final 分别指示排序过程中得到的有序序列中的 第一个记录和最后一个记录在d中的位置。
二路插入排序
讲解: 王云飞 flash:史涵旭 习题: 崔淇瑞
ppt: 杨宇
• 基本思想 • 直接插入算法虽然简单,但当记录数量 n很大时,则比较次数将大大增加,对于有 序表(限于顺序存储结构),为了减少关 键字的比较次数,可采用二路插入排序。 • 二路插入排序的基本思想是:用二分 查找法在有序表中找到正确的插入位置, 然后移动记录,空出插入位置,再进行插 入。