- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
排序方法分类 10.2 插入排序 算法分析 需1个记录的辅助空间r[0]; 记录个数为n,则n-1趟插入; 最好情况下(正序) 记录不需移动。 最差情况下(逆序) 直接插入排序所需进行关键字间的比较次数和记录移动次数约为:n2/4,算法时间复杂度为:O(n2)。 直接插入排序是一个稳定的排序方法。 2. 折半插入排序 算法分析 3. 2-路插入排序 目的是减少记录移动的次数 以第一个记录为界,小于第一个记录的插入到前半部分,否则插入后半部分 第一个记录不动,视为中间位置 将整个数组视为一个循环队列,设置first和final两个指针指向第一个记录和最后一个记录 3. 2-路插入排序 算法分析 4. 表插入排序 目的是不移动记录,只改变指针 每个记录维护一个next指针,构成一个循环链表 插入动作体现为改变next指针 4. 表插入排序 5. 希尔排序( Shell’s Sort) 1959年 “缩小增量排序” 开始时 Gap 的值较大,子序列中的记录较少,排序速度较快;随着排序进展,Gap 值逐渐变小,子序列中记录个数逐渐变多,由于前面工作的基础,大多数序列已基本有序,所以排序速度仍然很快。 关键字比较次数和记录移动次数与增量选择之间的依赖关系,并给出完整的数学分析,还没有人能够做到(难题)。 Gap的取法有多种。最初 shell 提出取 gap = ?n/2?,gap = ?gap/2?,直到gap = 1。后来knuth 提出取gap = ?gap/3? +1。还有人提出都取奇数为好,也有人提出各gap互质为好。 Knuth利用大量的实验统计资料得出,当 n 很大时,关键字平均比较次数和记录平均移动次数大约在 n1.25 到 1.6n1.25 的范围内,当n→∞时,可减少到n(log2n)2。这是在利用直接插入排序作为子序列排序方法的情况下得到的。 希尔排序不是稳定的排序方法。 算法分析 正序:进行n-1次关键字的比较,且不移动记录; 逆序:进行n-1趟排序 算法分析 2. 树形选择排序(锦标赛排序) 算法分析 锦标赛排序构成的树是满的完全二叉树,其深度为 ?log2n?+1,其中 n 为待排序记录个数。 除第一次选择具有最小关键字的记录需要进行 n-1 次关键字比较外,选择具有次小、再次小关键字记录所需的关键字比较次数均为 O(log2n)。总关键字比较次数为O(nlog2n)。 记录的移动次数不超过关键字的比较次数,所以锦标赛排序总的时间复杂度为O(nlog2n)。 这种排序方法虽然减少了许多排序时间,但是使用了较多的附加存储。 锦标赛排序是一个稳定的排序方法。 { 96, 83, 27, 38, 11, 9 } 堆排序解决2个问题 ①如何由一个无序序列建成一个堆? ②如何在输出堆顶元素之后,调整剩余元素成为一个新的堆? ①如何由一个无序序列建成一个堆?反复“筛选”的过程。 从i= ?n/2?到1,反复“筛选”。 最大堆的初始化 最大堆的初始化step1 最大堆的初始化step2 最大堆的初始化step3 最大堆的初始化step4_0 最大堆的初始化step4_1 最大堆的初始化step5_0 最大堆的初始化step5_1 最大堆的初始化step5_2 typedef SqList HeapType; void HeapAdjust( HeapType H, int s, int m) { rc = H.r[s]; for( j=2*s; j=m; j*=2){ if( jm H.r[j].key H.r[j+1].key) ++j; if( rc.key = H.r[j].key) break; H.r[s] = H.r[j]; s = j; } H.r[s] = rc; } void HeapSort( HeapType H ) { for( i=H.length/2; i0; --i) //建立初始堆 HeapAdjust( H, i, H.length); for( i=H.length; i1; --i){ H.r[1] ←→ H.r[i]; HeapAdjust( H, 1, i-1 ); } } 算法分析 作业: 10.12 10.5 归并排序 (Merging Sort) 归并: 是将两个或两个以上的有序表合并成一个新的有序表。 2-路归并:假设初始序列有 n 个记录,首先把它看成是 n 个长度为 1 的有序子序列 (归并项),先做两两归并,得到 ?n / 2?
文档评论(0)