专题排序和查找课件.ppt

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

例题 有8个关键字8,3,2,9,7,1,5,4,使用归并排序方法将其排列为升序序列,给出排序过程 解: 初 始: 8, 3, 2, 9, 7, 1, 5, 4 第一趟: 3, 8, 2, 9, 1, 7, 4, 5 第二趟: 2, 3, 8, 9, 1, 4, 5, 7 第三趟: 1, 2, 3, 4, 5, 7, 8, 9 排序结束。 * 自然归并排序 natural merge sort 进一步改进:若原始序列中存在有序子序列,则不进行分解 [4, 8, 3, 7, 1, 5, 6, 2] ?[4, 8], [3, 7], [1, 5, 6], [2] ?[3, 4, 7, 8], [1, 2, 5, 6] ?[1, 2, 3, 4, 5, 6, 7, 8] * 主要内容 归并排序 快速排序 希尔排序 排序算法的分析与比较 关于查找的讨论 * 思想 按照元素的值进行划分 对给定数组中的元素进行重新排列,以得到一个快速排序的分区 在一个分区中,所有在s下标之前的元素都小于等于A[s],所有在s下标之后的元素都大于等于A[s] 建立了一个分区以后,A[s]已经位于它在有序数组中的最终位置。接下来使用同样的方法继续对A[s]前和A[s]后的子数组分别进行排序 快速排序 * //Quicksort[A[l…r]] //input:数组A[0…n-1]中的子数组A[l…r] //output:排序后的数组 if lr s?Partition(A[l…r]) Quicksort(A[l…s-1]) Quicksort(A[s+1…r]) 算法描述 算法的前提是选择一个元素,根据该元素的值来划分子数组,这个元素就是中轴,我们暂时选择数组的第一个元素作为中轴,即p=A[l] * 思想 为了建立一个分区,有许多不同的方法对元素重新排列,其中一种是基于两次扫描子数组的高效算法 一次是从左到右,另一次是从右到左,每次都把子数组的元素和中轴进行比较 从左到右的扫描(i)从第二个元素开始,因为我们希望小于中轴的元素位于子数组的第一部分,扫描会忽略小于中轴的元素,直到遇到第一个大于等于中轴的元素才会停止 从右到左的扫描(j)从最后一个元素开始,扫描忽略大于中轴的元素,直到遇到第一个小于等于中轴的元素才会停止 两次扫描停止后,取决于扫描的指针是否相交,会发生3种不同的情况 Partition算法 * 描述 如果扫描指针i和j不相交,也就是说ij,简单的交换A[i]和A[j] 分别对i加一、j减一,然后继续开始扫描 示意 情况一 * 描述 如果扫描指针相交,也就是说ij,把中轴和A[j]交换 示意 情况二 * 描述 如果指针停下来时指向的是同一个元素,也就是说i=j,被指向元素的值一定等于p,此时建立的分区中分裂点的位置S=i=j 示意 情况三 * p?A[l] i?l,j?r+1 repeat repeat i?i+1 until A[i]=p repeat j?j-1 until A[j]=p swap(A[i],A[j]) until i=j swap(A[i],A[j]) swap(A[l],A[j]) return j Partition算法描述 算法合并了情况二和情况三,即当i=j时也做了一次无谓的交换 i可能越界而j不可能越界,因此实现时需要对i进行特殊处理 * * 改进 随机数、两平均、三平均中轴选择算法 当子数组足够小时改用最简单的排序算法 综合运用这些措施,可缩减20%时间 快速排序的改进 * 提示 快速排序算法要求熟练掌握源代码 * 主要内容 归并排序 快速排序 希尔排序 排序算法的分析与比较 关于查找的讨论 * 希尔排序 又叫缩小增量排序 算法思想:设待排序列含n个元素 取整数gap=floor(n/3)+1,将每隔gap的元素放在一个子序列中,对子序列插入排序 然后缩小间隔,令gap=floor(gap/3)+1,对新的子序列插入排序 重复上述过程,直至gap=1时最后执行一次 * Shell排序例 * Shell排序例(续) * 算法分析 开始时 序列数较多,每个序列元素数较少,排序快 排序后期 子序列元素数增多,但大多有序,再执行插入排序效率较高 希尔排序性能与gap选取有关,一般认为其优于O(n2),但很难达到O(nlogn) * 实现 templateclass T void ShellSort(T a[], int n) { int increment, start; for (increment = n / 3 + 1; increment = 1; increment = increment / 3 +1) for (start = 0; start increment;

文档评论(0)

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

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

1亿VIP精品文档

相关文档