DS13_排序a_陈越主编_数据结构.ppt

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * 第7章 排序 §7.1 引子 ?排序是很常见的一类问题(并不局限于排序本身) [例7.1] 有1亿个随机给出的浮点数,请找出其中最大的1万个。 方法1: 简单选择法 ? 总比较次数为N-1+(N-2)+…+(N-10000)次。当N为1亿时,大约为1万亿次。 “分而治之” 方法2: ? 比如,以1百万为一个块,分为100块,分别对这100块数据进行排序。由于只需要得到最大的1万个数,故每块排完后可以只要前1万个数,再从这100块共100万个数中取最大的1万个就可以了。 ? 当N为100万时,O(NlogN)是2000万,所以求解101块百万数据的排序问题,时间大约是20亿次运算。 堆选择 方法3: ? 先读出1百万个数,建立初始堆(100万运算量),对剩下的近1亿个数进行过滤:每次读入剩下的一个数,如果该数小于等于这1万个数的最小值,则继续读下一个数;否则,用该数替代1万个数里的最小值。 ? 100万(1百万建堆)+ 1亿(顺序过滤)+ 14 * 1千万,共约2.4亿。 (1万亿) (20亿) (2.4亿) N=1亿,log10000=14 过滤所有数据需要 14亿? No! 随机数将使得绝大多数 很快被排除!比如只有 大约1/10需要替换。 第7章 排序 §7.2 选择排序 ?简单选择排序 ? 时间复杂性 T(n) = O(n2) ? 空 间复杂性S(n) = O(1) ? 稳定性:不稳定。反例如下: 2 2 1 1 2 2 不稳定! 排序前 2 领先于 2 2 落后于 2 排序后 ? 堆排序的核心思想是:利用最大堆(或者最小堆)输出堆顶元素,即最大值(或最小值),将剩余元素重新生成最大堆(或者最小堆),继续输出堆顶元素,重复此过程,直到全部元素都已输出,得到的输出元素序列即为有序序列。 ?堆排序(属于选择排序大类) 对初始已经有序的序列 没有实质性的省时间优势。 99 66 45 37 10 33 22 13 99 13 66 45 37 10 33 22 99 66 37 45 13 10 33 22 第7章 排序 §7.2 堆排序 〖例〗 花了logN的时间搞定了最大元素。以后类似可以搞定第二大、第三大…元素。 一次性花O(N)的时间建立成最大堆。 从根往较大孩子方向渗透到合适位置。 void Adjust( ElementType A[], int i, int N ) { /* 对A[]中的前N个元素从第i个元素开始向下迁移调整 */ int Child; ElementType temp; for( temp = A[i]; (2*i + 1) N; i = child){ Child = (2*i + 1); /* 左孩子节点 */ if ( (Child != N-1) A[Child + 1] A[Child]) Child++; /* Child指向左右子结点的较大者 */ if( temp A[Child] ) A[i] = A[Child]; /* 移动Child元素到上层 */ else break; } A[i] = temp; /*将temp放到当前位置 */ } void HeapSort( ElementType A[], int N ) /* 堆排序 */ { int i; ElementType temp; for( i = (N-1)/2; i = 0; i-- ) /*从有儿子的最后一个结点开始*/ Adjust(A, i, N); /* 建立最大堆*/ for( i = N-1; i 0; i-- ){ /* 将堆顶元素A[0]与当前堆的最后一个元素A[i]换位 */ temp = A[0]; A[0] = A[i]; A[i] = temp; /* 将有i个元素的新堆从根结点向下过滤调整 */ Adjust(A, 0, i); } } 与DeleteMax( MaxHeap H )类似。 第7章 排序 §7.2 堆排序 第7章 排序 §7.2 选择排序 ? 时间复杂性 T(n) = O(nlogn) ? 空 间复杂性S(n) = O(1) ? 稳定性:不稳定。反例如下: 不稳定! 排序前 2 领先于 2 2 落后于 2 排序后 ? 堆排序(属于选择排序大类) 2 1 2 1 2 2 2 1 [1] [2] 2 [3] 2 1 [1

文档评论(0)

70后老哥 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档