直接插入排序示例.PPT

  1. 1、本文档共67页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
直接插入排序示例

* 树形选择排序示例 13 13 65 13 27 65 38 49 1 38 38 97 76 13 27 49 2 (a)选出最小关键字13 27 27 65 76 27 65 38 49 1 38 38 97 76 ∞ 27 49 2 (b)选出次小关键字27 * 树形选择排序示例 (c)选出居第三的关键字38 38 65 76 65 38 49 1 38 38 97 76 ∞ 49 2 ∞ 2 49 49 2 (b)选出居第四的关键字491 491 65 76 65 49 1 97 76 ∞ 49 2 ∞ 2 49 49 2 ∞ 49 1 49 1 * 在树形选择排序中,被选中的关键字都是走了一条由叶子结点到根结点的比较的过程, 由于含有n个叶子结点的完全二叉树的深度为 ,则在树形选择排序中,每选择一个次小关键字需要进行 次比较,因此其时间复杂度为O(nlog2n)。移动记录次数不超过比较次数,故总的算法时间复杂度为O(nlog2n)。 * 与简单选择排序相比, 树形选择排序降低了比较次数的数量级,增加了额外的存储空间来存放中间比较结果,同时附加了与∞进行比较的时间耗费。为了弥补以上不足,威洛姆斯(J.Willioms)在1964年提出了进一步的改进方法,即另外一种形式的选择排序方法——堆排序。 * 从表插入排序的过程可见,其基本操作仍然是将一个记录插入到已经排好序的有序表中。 和直接插入排序不同的是以修改2n次指针值代替移动记录,排序中所需进行的关键字的比较次数相同,因此表插入排序的时间复杂度仍然是O(n2)。 * 10.2.3 希尔排序 希尔排序的基本思想是:先将待排序记录序列分割成若干子序列,分别进行直接插入排序。待整个序列中的记录已经基本有序,最后再对全部记录进行一次直接插入排序。 * 具体实现: 首先选定两个记录间的距离d1,在整个待排序记录序列中将所有间隔为d1的记录分成一组,进行组内直接插入排序; 然后再取两个记录间的距离d2(d1),在整个待排序记录序列中,将所有间隔为d2的记录分成一组,进行组内直接插入排序,直至选定两个记录间的距离dt=1为止; 此时只有一个子序列,即整个待排序记录序列,对其进行一趟直接插入排序。希尔排序也称为“缩小增量排序”。 * 希尔排序示例 46 55 13 42 94 17 05 70 ① ② ③ ④ 取d1=4,分为4个间隔为4的子序列,各子序列内进行插入排序,结果为: 46 17 05 42 94 55 13 70 ① ② 取d2=2,分为2个间隔为2的子序列,各子序列内进行插入排序,结果为: 05 17 13 42 46 55 94 70 ① 取d3=1,分为1个间隔为1的子序列,各子序列内进行插入排序,结果为: 05 13 17 42 46 55 70 94 初始关键字序列: * 由上述排序过程可知,希尔排序的一个特点是:子序列的构成是由相隔某个“增量”的记录组成的。 如第一趟排序时的增量是4,第二趟排序时的增量为2,每次排序时插入记录的关键字是和同一子序列中的前一个记录的关键字比较,因此关键字较小的记录是跳跃式地前移,从而在最后一趟增量为1的插入排序时,序列已基本有序,只要作少量比较和移动即可。 * void ShellInsert(SqList L, int dk){ //对顺序表L做一趟希尔插入排序 for (i=dk+1; i=L.length; i+=dk) {//dk+1为第一个子序列的第二个元素下标  if (L.r[i].key L.r[i-dk].key) {//需将L.r[i]插入有序增量子表 L.r[0]=L.r[i]; //暂存在L.r[0]中 for (j=i-dk; j0 (L.r[0].key L.r[j].key); j-=dk) L.r[j+dk]=L.r[j];  //记录后移,查找插入位置 L.r[j+dk]=L.r[0];  //插入记录 } }//ShellInsert void ShellSort(SqList L, int dlta[], int t) { //按增量序列dlta[0..t-1]对顺序表L作希尔排序 for(k=0; kt; ++k

您可能关注的文档

文档评论(0)

fengruiling + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档