排序法图文并茂.docVIP

  1. 1、本文档共15页,可阅读全部内容。
  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 算法思路: 冒泡排序首先通过两两比较,如果aai+1则交换位置,否则不交换,这样往往使 最后一个数据最大。而对于这个最大的数据前面的数据还不是有序的,因此还要对这个最大数据前面的数列继续采用两两交换的方法,并且它后面的数不用排序。以此类推直到“最大数“前面只有一个数为止,这样就形成了一个有序的数列。 操作步骤如下图: 原始数据: (两两比较) 第一次排序后: (最后一个最大) 第二次排序后: 第三次排序后: 第四次排序后 (注:从左到右两两比较交换后,再看下一组,如ai,ai+1为一组比较后,ai+1,ai+2为一组在比较) 2、算法实现: #includestdio.h void main() { int a[]={100,12,6,9,2,13},i,j,tmp; for(i=0;i6;i++) { for(j=0;j6-1-i;j++) //两两比较次数 { if(a[j]a[j+1]) { tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp; } } } for(i=0;i6;i++) { printf(%d,,a[i]); } } 3、算法复杂性: (n-1) + (n-2) + ... + 1 = n * (n - 1) / 2=T(n)=O(f(n))(最坏情况) T(n)=O(n)(最优情况); 二、直接插入排序 1、算法思路:(主要通过文字与图形结合阐述原理) 该算法的基本思想是,把待比较的数列从第一个取出看成一个有序新数列,第二次 时把第二个数“取出”放到刚才只有一个数的有序数列中并进行比较后放到相应位 置。后面第三个也是同样的放到由两个数组成的有序数列中,依次类推直到后面没 数可“取”为止。 操作步骤如下图: 每次当一个数据要插入到数列时,由于数列是有序的,因此插入的数据只需从 右(最大)往左依次与每个元素比较,只要它小于(按升序排时)左边元素就交换。 2、算法实现: 由C语言编程实现,定义一个数组用来存放待排序的数据,由于数组的第一 个序列只有一个数据——(数组的第一个元素)有序数列就是它本身,从数 组的第二个元素开始插入进行真正的排序。因此采用两个函数,一个取出要 插入的元素,另一个函数用于插入时在前面有序的数列中进行排序。 代码如下: #includestdio.h void ch(int x[],int i) { int tmp; while(i0) { if(x[i]x[i-1]) //用待插入的数据依次与有序数列从右到左依次排序 //遇到比它大的就交换; { tmp=x[i]; x[i]=x[i-1]; x[i-1]=tmp; } else break; //由于是插入到有序数列,因此只要一遇到比它小的,那么 //前面的都比它小。就退出。 i--; } } void main() { int a[]={29,4,10,1,6,2,7},i,j,tmp; for(i=1;i7;i++) { if(a[i]a[i-1]) //a[i]为被插入数据。如果它比有序数列中的第一个 //大,那么则把的下标记。 { j=i; ch(a,j); } } for(j=0;j7;j++) { printf(%d,,a[j]); } } 3算法复杂度T(n)=O(n^2).先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。具体实施以下图为列:选择一个增量t(tn/待排元素个数),而要进行直接排序的数据的下标相差t,也就是a0与a0+t进行直接插入排序,第二组为a1与a1+t进行直接插入排序,依次类推到最后一个数数据,(注:第二组必须在第一组进行完后得到的结果上才开始)再开始下一次这样从头到尾的直接插入排序,只是每一次的开始t增量都要减1,知道t=1,才结束。 下列我们选择t=3 11、9、10、6、8、7 第一次t=3 第二次t-1=2 第三次t-1=1 最后结果: 2、算法实现 #includestdio.

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档