- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                09排序
                    实施冒泡排序时,要对n个记录的关键字序列进行n?1次扫描。每次扫描时,都从下到上对相邻的两个关键字进行比较,如果不符合由小到大的顺序,就将它们交换位置。  9.3.1  冒泡排序     这样,经过第1次扫描,就能从n?1对相邻关键字的比较中,把关键字序列里最大的元素渐渐地移动到序列的最上边;经过第2次扫描,就能从n?2对相邻关键字的比较中,把关键字序列里次大的元素渐渐地排到序列的次上位置;如此最多经过n?1次扫描,n个关键字都排到了自己应该位于的位置。     例9-5  有待排的记录关键字序列:84、30、73、、26、51,把它们存放在一个一维数组A里,然后对它们进行冒泡排序,最后给出排序结果。 图9-9  冒泡排序过程示例     算法9-4  冒泡排序算法。     已知有n个记录的无序序列,存放在一个一维数组Ar里。对它进行冒泡排序,并最后得到排序结果。算法名为Bub_Sort(),参数为Ar、n。     冒泡排序是一种稳定排序算法。   Bub_Sort(Ar, n) {   for (i=1; in; i++)  /* 对无序记录序列进行n?1趟扫描 */   {     flag = 0;    /* 这一趟是否发生交换的标志 */     for (j=1; j=n-i; j++)  /* 这趟扫描的范围是从1到n?i */       if (Ar[j].keyAr[j+1].key)  /* 通过temp进行交换 */       {         temp = Ar[j+1].key;         Ar[j] .key = Ar[j+1] .key;         Ar[j+1] .key = temp;         flag = 1;       }     if (flag == 0) /* 若没有发生交换,就结束算法 */         break;   } }     例9-6  有待排记录的关键字序列:77、44、99、66、33、55、88、22,把它们存放在一个一维数组A里,然后对它们进行冒泡排序,最后给出排序结果。      快速排序的基本思想是:在待排序的n个关键字序列里,选择一个基准元素x,称其为“枢轴(Pivot)”。通常,把序列的第1个元素选为枢轴,也可以把位于序列中间位置的元素选为枢轴。然后把所有小于等于x的关键字调整到x的左边,把大于x的关键字调整到x的右边。这被称为是快速排序的一次划分。  9.3.2 快速排序     继续对左、右两个部分重复进行相同的这种划分过程,每次划分后就会让作为枢轴的关键字位于它最终应该在的位置上,直到最后分割的每一部分都只有一个关键字时,才结束整个排序过程。  图9-11  快速排序的一次划分示意     算法9-5  快速排序一次划分算法。     已知待排序的关键字序列存放在一维数组Ar里。现在要排序的子序列起始于第s个元素,终止于第t个元素。要对Ar[s]~Ar[t]里的关键字序列做快速排序的一次划分。算法名为Qukpass_Sort(),参数为Ar、s、t。  Qukpass_Sort(Ar, s, t) {   low = s;                           /* ?low为划分时序列的左边界 */   high = t;	               /* ?high为划分时序列的右边界 */   temp = Ar[s];	              /* 把枢轴值暂存于temp */   while (lowhigh)   {     while ( (highlow)  (temp.keyAr[high].key))	/* 把大于枢轴的关键字留在右边的子序列里 */       high--;     if (lowhigh)              /* 把小于等于枢轴的关键字移到左边 */     {       Ar[low] = Ar[high];       low++;     }     while ((lowhigh)  (Ar[low].key=temp.key))	/* 把小于枢轴的关键字留在左边的子序列里 */       low++;     if (lowhigh)	          /* 把大于枢轴的关键字移到右边 */     {       Ar[high] = Ar[low];       high--;     }   }   Ar[low]=temp;				 /* 把枢轴值存入正确位置 */ }     例9-7  有关键字序列:70、85、69、35、93、23、71、68、55,存放在一个一维数组A中。试应用快速排序一次划分算法,完成对它们的
                
原创力文档
                        
                                    

文档评论(0)