- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
复习内容(计算机高级语言设计):排序问题C!幻灯片
5、基数排序 对于一般的基数r,相应的分解式为: x%r;(x%r2)/r;(x%r3)/r2;... 当使用基数r=n对n个介于0~nc-1范围内的整数进行分解时,每个数将可以分解出c个数字。 因此,可以采用c次箱子排序,每次排序时取range=n。整个排序所需要的时间为Θ(cn)= Θ(n)(因为c是一个常量)。 6、堆排序 先将要排序的n 个元素初始化为一个最大堆,然后每次从堆中提取(即删除)元素。各元素将按递减次序排列。 初始化所需要的时间为(n),每次删除所需要的时间为O(logn) ,因此总时间为O(nlogn) 。 6、堆排序 template class T void HeapSort(T a[], int n) {// 利用堆排序算法对a[1:n] 进行排序 // 创建一个最大堆 MaxHeapT H(1); H.Initialize(a,n,n) ; // 从最大堆中逐个抽取元素 T x; for (int i = n-1; i = 1; i--) { H.DeleteMax(x) ; a[i+1] = x; } // 在堆的析构函数中保存数组a H.Deactivate(x) ; } 6、堆排序 堆排序的初始化策略: 从第一个具有孩子的节点开始,这个元素在数组中的位置为i=[n/2],如果以这个元素为根的子树已是最大堆,则此时不需调整,否则必须调整子树使之成为堆。 随后,继续检查以i-1,i-2等节点为根的子树,直到检查到整个二叉树的根节点(其位置为1)。 6、堆排序 6、堆排序 6、堆排序 11,20,15,7,2,9,28,32,1,18 最大堆? 最小堆? * * Agenda 名次排序 选择排序 冒泡排序 插入排序 基数排序 堆排序 归并排序 快速排序 1、名次排序 元素在队列中的名次(rank)可定义为队列中所有比它小的元素数目加上在它左边出现的与它相同的元素数目。 例如,给定一个数组a=[4, 3, 9, 3, 7]作为队列,则各元素的名次为r=[2,0,4,1,3]。 1、名次排序 template class T void Rank(T a[], int n, int r[]) { //计算a [0:n-1]中n个元素的排名 for (int i = 0; i n; i++) r[i] = 0; //初始化 //逐对比较所有的元素 for (int i = 1; i n; i++) for ( int j = 0; j i; j++) if (a [j] = a[i]) r[i]++; else r[j]++; } 1、名次排序 template class T void Rearrange (T * a, int n, int r[]) { //按序重排数组a中的元素,使用附加数组u T *u = new T[n+1]; //在u中移动到正确的位置 for ( int i = 0; i n; i++) u[r[i]] = a[i]; delete [ ]a; a=u; } 根据a的元素之间所进行的比较操作来估算程序的时间复杂性。 对于i的每个取值,执行比较的次数为i,所以总的比较次数为1+2+3+ … +n-1 = (n-1)n/2。 移动操作次数为:n 1、名次排序 2、选择排序 思想: 首先找出最大的元素,把它移动到a[n-1],然后在余下的n-1个元素中寻找最大的元素并把它移动到a[n-2],如此进行下去。 templateclass T int Max(T a[], int n) {// 寻找a [0 : n-1]中的最大元素 int pos = 0; for (int i = 1; i n; i++) if (a[pos] a[i]) pos = i; return pos; } 每次调用Max(a,size)需要执行size-1次比较。 2、选择排序 2、选择排序 template class T void SelectionSort (T a[], int n) { //对数组a [0:n-1]中的n个元素进行排序 for ( int size = n; size 1; size- -) { int j= Max(a, size); //size-1次比较 Swap( a[j],a[size-1] ) ; //移动3次 } } 按照元素的比较次数来估算函数的时间复杂性。 每次调用Max(a,size)需要执行size-1次比较,所以总的比较次数为: 1+2+3+…+n-1= (n-1)n/2。 移动次数为:3(n-1) 2、选择排序 上述程序中选
您可能关注的文档
最近下载
- 某尾矿溢水塔回水隧洞封堵工程施工方案.pdf VIP
- 婴幼儿的早期教育工作总结PPT.pptx VIP
- 【高考真题】重庆市2025年高考真题物理试卷(含答案).pdf VIP
- 教案对外汉语我是跟旅游团一起来的.pdf VIP
- 2024年秋季新教材人教版一年级上册数学全册教案-129页.docx VIP
- 2024-2025学年初中英语九年级上册牛津上海(试用本)教学设计合集.docx
- 2020年《城镇燃气设计规范》GB50028-2006 .pdf VIP
- T_CDHA 13-2023 热力管道用金属波纹管补偿器.pdf
- 燃气工程技术专业基础知识考试题库(含答案).docx VIP
- 室内滑雪馆消防设计探讨.pdf VIP
文档评论(0)