内部排序.ppt

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

10.2 插入排序 10.3 交换排序 例 链表起泡排序-下沉法 10.4 选择排序 (Selection Sort) 例 链表选择排序 1、初始堆的建立 2、调整和重建 10.6 基数排序 箱排序、桶排序 Bin Sort、Bucket Sort 基数排序 (Radix Sort) 一、 二路归并排序基本思想 初始排序表看成n个长度为1的有序子表,两两归并,得到 ?n/2? 个有序的子表(当n为奇数时,归并后仍有一个长度为1的子表);再把这些有序子表两两归并,如此反复,直到最后得到一个长度为n的有序表为止。 10.5 归并排序 (Merging Sort) 利用“归并”技术来进行排序,所谓归并是指将若干个已排序的子表合并成一个有序表。 例,(49,38,65,97,76,13,49’)二路归并排序。 void Merge(list R,list R1       ,int low,int mid,int high) { //合并R[low]~R[mid]、R[mid+1]~R[high],结果在R1中 int i,j,k; i=low;j=mid+1;k=low; while(i=mid j=high) if(R[i].key=R[j].key) R1[k++]=R[i++];//小者 else R1[k++]=R[j++]; while(i=mid) R1[k++]=R[i++];//复制左子表剩余 while(j=high) R1[k++]=R[j++];//复制右子表剩余 } 1、两子表合并 二、算法实现 void MergePass(list R,list R1,int n,int len) {  //对R做一趟归并,结果在R1中 int i,j; i=1; //i指向第一对子表的起始点 while(i+2*len?1=n) { //归并长度为len的两个子表 Merge(R,R1,i,i+len?1,i+2*len?1); i=i+2*len; //i指向下一对子表起始点 } if(i+len?1n) //剩两子表,一个长度小于len Merge(R,R1,i,i+len?1,n); else //子表个数为奇数,剩一段 for(j=i;j=n;j++)//将最后一个子表复制到R1中 R1[j]=R[j]; } 2、一趟归并 设子表长度len,对子表个数奇数、最后子表长度小于len两种情况特殊处理。 void MergeSort(list R,list R1,int n) {  //对R二路归并排序,结果在R中(非递归) int len; len=1; while(lenn) { MergePass(R,R1,n,len);len=len*2; //一趟归并,结果在R1中 MergePass(R1,R,n,len);len=len*2; //再次归并,结果在R中 } } 3、归并排序 若干次调用“一趟归并”,每趟子表长度扩大一倍。第一趟子表长度为1,当子表长度≥n时结束。 三.效率分析 子表长度不断加倍,1→n,归并趟数为?log2n?;每趟归并比较次数≤移动次数,后者为O(n);总时间复杂度O(nlog2n)。 辅助空间为数组R1,空间复杂度O(n) 键值相同记录顺序复制,不改变相对位置,故是稳定的。 可在链表上实现 利用关键字结构,通过“分配”和“收集”实现排序 无需比较关键字。 可分为箱排序和基数排序两类。 49 27 13 76 97 65 38 49 8 7 6 5 4 3 2 1 初始关键字 49 65 97 76 49 13 38 27 49 65 97 76 49 38 27 13 97 76 65 49 49 38 27 13 97 76 65 49 49 38 27 13 97 76 65 49 49 38 27 13 例,对(49,38,65,97,76,13,27,49’)快速排序 快速排序的判定树: 树根表示基准,左右子树表示划分的两个区间,每个子区间继续用子二叉树表示。 int Partition(list R,int p,int q) { //对无序区R[p]到R[q]划分,返回划分后基准的位置 int i,j; i=p; j=q; R[0]=R[i]; //R[0]作辅助量,存基准(无序区第一个记录) while(ij) { while(R[j].key=R[0].key

文档评论(0)

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

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

1亿VIP精品文档

相关文档