算法与数据结构:21-排序2.pdf

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二十一讲 排序 ——希尔排序、堆排序 冒泡排序、简单选择排序、直接插入排序等 2 简单排序方法的平均时间复杂度均为O(n ) 2 排序算法时间复杂度能否低于O(n ) ? Donald L. Shell (1924.3-2015.11 )  1959年提出了一个缩小增量排序方法,突破 2 了排序算法O(n )的时间复杂度  后被命名为希尔排序 希尔排序——对直接插入排序的改进  直接插入排序 第i趟用r[0]表示待插入记录r[i+1],将前i个已 排好序的记录中比r[0]大的记录依次后移一个单 元,将r[0]插入空出的位置 下标 0 1 2 3 4 5 6 7 8 9 r 3 1 5 8 9 3 7 4 6 2 void InsertSort( SqList L) //直接插入排序 { int i, j; for(i=2; i<L.length; i++) // 将L.r[i]插入有序子表r[1]…r[i-1] { if ( L.r[i]<L.r[i-1] ) { L.r[0] = L.r[i]; // 待插入记录暂存于r[0] for ( j = i-1; L.r[j] > L.r[0]; j--) // 将所有大于r[0]的记录逐一后移 L.r[j+1] = L.r[j]; L.r[j+1] = L.r[0]; // 将r[i] 插入到合适位置 } } 2 } 时间复杂度最好为O(n),最坏O(n ) 适合n较小或初始序列基本有序的情况 改进思路  分组进行  每组的记录个数较少,组内排序较快  基本有序后采用直接插入,需要移动的次数有限  如何分组?  每隔一定数量h (增量)取一个记录组成子序列  排序时记录会跳跃式移动  逐步缩小增量h至1 例L = {49,38,65,97,76, 13, 27, 49, 55, 4} 希尔排序V.S. 直接插入排序 注:只计算记 录后移次数 希尔排序 初始: 49 38 65 97 76 13 27 49 55 4 取h=5 一趟分组: 移动5次 一趟排序: 13 27 49 55 4 49 38 65 97 76 取h=3 二趟分组: 移动2次 二趟排序:13 4 49 38 27 49 55 65 97 76 移动5次 三趟排序:

文档评论(0)

学习让人进步 + 关注
实名认证
内容提供者

活到老,学到老!知识无价!

1亿VIP精品文档

相关文档