数据结构——第9章内排序(C#).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
以后对所有的两部分分别重复上述过程,直至每部分内只有一个记录为止。   简而言之,每趟使表的第一个元素放入适当位置,将表一分为二,对子表按递归方式继续这种划分,直至划分的子表长为1。 public void QuickSort() //对R[0..n-1]的元素按递增进行快速排序 {   QuickSort1(0,length-1); } private void QuickSort1(int s,int t) //对R[s..t]的元素进行快速排序 {  int i=s,j=t; RecType tmp;   if (st) //区间内至少存在两个元素的情况   { tmp=R[s]; //用区间的第1个元素作为基准 while (i!=j) //从区间两端交替向中间扫描,直至i=j为止 {  while (ji R[j].key=tmp.key)  j--; //从右向左扫描,找第1个小于tmp.key的R[j]   R[i]=R[j]; //找到这样的R[j],R[i]和R[j]交换   while (ij R[i].key=tmp.key)  i++;  //从左向右扫描,找第1个大于tmp.key的元素R[i]   R[j]=R[i]; //找到这样的R[i],R[i]和R[j]交换 } R[i]=tmp; QuickSort1(s,i-1); //对左区间递归排序 QuickSort1(i+1,t); //对右区间递归排序   } } 划分 例9.4 设待排序的表有10个记录,其关键字分别为{6,8,7,9,0,1,3,2,4,5}。说明采用快速排序方法进行排序的过程。 则可得结果: 结论: 快速排序的时间复杂度为O(nlog2n) 由此可得快速排序所需时间的平均值为: 平均所需栈空间为O(log2n)。 n k-1 n-k 1次划分的时间 Tavg(n)=Cnlog2n。 9.4 选择排序 选择排序的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子表的最后,直到全部记录排序完毕。  两种选择排序方法:  (1)简单选择排序(或称直接选择排序)  (2)堆排序 9.4.1 直接选择排序   基本思想:第i趟排序开始时,当前有序区和无序区分别为R[0..i-1]和R[i..n-1](0≤i<n-1),该趟排序则是从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[0..i]和R[i+1..n-1]分别变为新的有序区和新的无序区。 假设排序过程中,待排记录序列的状态为: 有序序列R[0..i-1] 无序序列 R[i..n-1] 第 i 趟 简单选择排序 从中选出关键字最小的记录 有序序列R[0..i-1] 无序序列 R[i+1..n-1] public void SelectSort() //对R[0..n-1]元素进行简单选择排序 { int i,j,min; RecType tmp;   for (i=0;ilength-1;i++) //做第i趟排序   { min=i; for (j=i+1;jlength;j++) //在当前无序区R[i..n-1]中选key最小的R[min]   if (R[j].keyR[min].key)  min=j;  //min记下目前找到的最小关键字所在的位置 if (min!=i)   //交换R[i]和R[min] { tmp=R[i]; R[i]=R[min];   R[min]=tmp; }   } } { 全局有序区 } R[i] …… R[n-1] 用选择找最小记录放到R[i]处 例9.5 设待排序的表有10个记录,其关键字分别为{6,8,7,9,0,1,3,2,4,5}。说明采用直接选择排序方法进行排序的过程。    对 n 个记录进行简单选择排序,所需进行的 关键字间的比较次数 总计为:  移动记录的次数,最小值为 0, 最大值为3(n-1) 。 9.4.2 堆排序 堆排序是一树形选择排序,它的特点是,在排序过程中,将R[1..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的记录。 堆的定义是:n个关键字序列K1,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质): (1)Ki≤K2i 且 Ki≤K2i+1 或 (2)Ki≥K2i 且 Ki≥K

文档评论(0)

sm8558 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档