网站大量收购独家精品文档,联系QQ:2885784924

第七图,查找,排序精要.ppt

  1. 1、本文档共76页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 算法分析 设待排序对象个数为 n, 则该算法的主程序执行n-1趟。 排序码比较次数和对象移动次数与对象排序码的初始排列有关。 最好情况下, 排序前对象已按排序码从小到大有序, 每趟只需与前面有序对象序列的最后一个对象比较1次, 总的排序 码比较次数为 n-1, 不需移动记录。直接插入排序的时间复杂度为O(n2)。 * 最坏情况下,待排记录按关键字非递增有序排列(逆序)时,第 i 趟时第 i+1 个对象必须与前面 i 个对象都做排序码比较, 并且每做1次比较就要做1次数据移动。总比较次数为(n+2)(n-1)/2次,总移动次数为(n+4)(n-1)/2。 在平均情况下的排序码比较次数和对象移动次数约为 n2/4。因此,直接插入排序的时间复杂度为 O(n2)。 直接插入排序是一种稳定的排序方法。 * 折半插入排序 (Binary Insertsort) 基本思想 既然每个要插入记录之前的纪录已经按关键字有序排列,在查找插入位置时就没有必要逐个关键字比较,可以使用折半查找来实现。由此进行的插入排序称之为折半插入排序。 * void BInsertSort (SqList L){ for (i=2;i=L.length;++i){ L.r[0]=L.r[i]; low=1;high=i-1; //查找范围由1到i-1 while(low=high){ m=(low+high)/2; if LT(L.r[0].key,L.r[m].key) high=m-1; else low=m+1; }//while 折半查找 for (j=i-1;j=high+1;--j) L.r[j+1]=L.r[j]; //折半查找结束后high+1位置即为插入位置 L.r[high+1]=L.r[0]; }//for }//BInsertSort 折半插入排序的算法 * 折半插入排序 0 1 2 3 4 5 6 i = 1 i = 2 0 1 2 3 4 5 6 5 21 3 3 i = 3 5 5 21 5 3 21 4 4 i = 4 21 5 3 8 8 i = 5 21 5 3 16 16 8 4 4 21 3 8 4 5 16 * 折半搜索比顺序搜索查找快, 所以折半插入排序就平均性能来说比直接插入排序要快。 它所需的排序码比较次数与待排序对象序列的初始排列无关, 仅依赖于对象个数。在插入第 i 个对象时, 需要经过 ?log2i? +1 次排序码比较, 才能确定它应插入的位置。因此, 将 n 个对象(为推导方便, 设为 n=2k )用折半插入排序所进行的排序码比较次数为: 算法分析 * 当 n 较大时, 总排序码比较次数比直接插入排序的最坏情况要好得多, 但比其最好情况要差。 在对象的初始排列已经按排序码排好序或接近有序时, 直接插入排序比折半插入排序执行的排序码比较次数要少。折半插入排序的对象移动次数与直接插入排序相同, 依赖于对象的初始排列。 折半插入排序是一个稳定的排序方法。 折半插入排序的时间复杂度为O(n2)。 * 基本思想: 当待排记录数n很小时,直接插入排序的效率较高。 当待排序列按关键字基本有序时直接插入排序的效率也较高。 所以从这两点出发可对直接插入排序改进,先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。 希尔排序 (Shell Sort)(缩小增量排序) * 设待排序对象序列有 n 个对象, 首先取一个整数 gap n 作为间隔, 将全部对象分为 gap 个子序列, 所有距离为 gap 的对象放在同一个子序列中, 在每一个子序列中分别施行直接插入排序。然后缩小间隔 gap, 例如取 gap = ?gap/2?,重复上述的子序列划分和排序工作。直到最后取 gap == 1, 将所有对象放在同一个序列中排序为止。 * i = 3 Gap = 3 0 1 2 3 4 5 21 08 25 49 25* 16 1 2 3 4 5 6 21 08 25 49 25* 16 i = 2 Gap = 2 21 08 25 49 25* 16 21 08 25 49 25* 16 i = 1 Gap = 1 21 08 25 49 25* 16 21 08 25 49 25* 1

文档评论(0)

宝贝计划 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档