排序学习指导书.pptVIP

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
排序学习指导书

1)起泡排序的基本思想 从第一个记录开始,将每两个相邻记录之间的关键字进行比较。若不符合排列顺序,就交换这两个记录,直到各记录有序为止。 2)起泡排序的过程 将关键字按纵向排列,然后自下而上地对每两个相邻的关键字进行比较,若逆序(即kj-1kj),则将两个记录交换位置,若正序,则取下一组记录,这样的操作反复进行,直到全部记录都比较、交换完为止。如此一趟排序后,就将关键字最小的记录安排在第一个记录的位置上。 然后对剩余的n-1个记录重复同样操作,在将次小关键字记录安排在第二个记录的位置上。 重复上述过程,直至没有记录需要交换为止。至此整个文件的记录按关键字由小到大的顺序排列完毕。 由于在排序过程中关键字小的记录像气泡一样逐趟向上飘,而大的记录则逐渐下沉,故形象的称为起泡排序。 起泡排序是稳定的排序方法。 3)起泡排序实例 4)起泡排序算法设计 对于n个记录进行起泡排序时,至多要进行n-1趟排序过程.但若在某一趟排序中没有记录需要交换,则说明待排序记录已按关键字有序,排序过程可以在此趟排序后结束. 在算法设计时,引入一个布尔量noswap,在每趟排序前,先将它置为TRUE,在每趟排序过程中,若有记录交换则修改noswap,将其置为FALSE, 在一趟排序结束时,再检查noswap,若noswap为TRUE,表示未曾交换过记录,应终止算法 5)起泡排序算法实现 void bubblesort(RECORD R[]) /*待排记录放在R[0]到R[n-1]中*/ {int i,j,noswap; rectype temp; for(i=0;in-1;i++) //外循环控制进行n-1趟排序 {noswap=TRUE; //置未交换标志 for(j=n-1;j>=i;j--) //从下往上扫描 if(R[j-1].keyR[j].key) //交换记录 {temp=R[j-1]; R[j-1]=R[j]; R[j]=temp; noswap=FALSE; //改变未交换标志 } if(noswap)break; //未发生交换,则终止算法 } } 6) 算法分析 若文件按关键字递增有序,即正序,则只需一趟排序,如:10,20,30,40,比较次数和记录的移动次数均为最小值; 若文件按关键字递减有序,即逆序,则需要进行n?1趟排序,如:40,30,20,10,比较次数和记录的移动次数均为最大值。 7) 算法改进 a)在每趟扫描中,记住最后一次交换发生的位置k,因为该位置之前的记录都已排好序,所以下一趟排序可终止于位置k,而不必进行到预定的下界i. b)若只有最轻的气泡位于文件的最末的位置,其余的记录均排好序的情况下,只需要一趟扫描就可以完成排序,如: 20,30,40,10 若只有最重的气泡位于文件的最开始的位置,其余的记录均排好序的情况下,则需要n-1趟扫描才能完成排序,如: 40,10,20,30 造成这种不对称的原因:每趟扫描使最重的气泡下沉一个位置,而每趟扫描使最轻的气泡适当的位置; 若改变扫描方向,从上往下扫描,则可以得到相反的结果; 因此,在算法设计时,交替改变扫描方向,可以改变这两种情况的不对称性。 快速排序 快速排序也称作划分交换排序,和冒泡排序同属于交换排序类型。它是目前内部排序中速度最快的排序方法,故称为快速排序,其平均时间复杂度为O(nlog2n) ,它偏爱记录随机分布的记录序列。 1) 快速排序的基本思想 在待排序的n个记录中任取一个记录R(通常为第一个),以该记录的关键字K为基准,将所有剩下的n?1个记录划分为两个子序列,第一个子序列中所有记录的关键字均小于或等于K;第二个子序列中所有记录的关键字均大于K。 然后将K所对应的记录R放在第一个子序列之后及第二个子序列之前,使得待排序记录序列成为子序列1R子序列2,完成快速排序的第一趟排序。然后分别对子序列1和子序列2重复上述划分,直到每个子序列中只有一个记录时为止。 2) 快速排序的对无序区的划分 设两个指针i、j,初始时分别指向第一个和最后一个记录,即令i=1,j=h,并将第一个记录暂存于变量temp(先用第一个记录的关键字k进行划分,称这个记录为控制记录或支点)。 当i<j时,重复以下操作: (1)若temp.key≤R[j].key,则j=j?1,即再比较j的 前一个记录关键字;否则R[j]与R[i]交换。 (2)比较temp.key与i指向的记录的关键字,若

文档评论(0)

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

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

1亿VIP精品文档

相关文档