八大排序算法的总结.docxVIP

  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文档。上传文档
查看更多
八大排序算法总结   一.希尔排序法/*Shell排序法*/   #include   voidsort(intv[],intn)   {   intgap,i,j,temp;   for(gap=n/2;gap0;gap/=2)/*设置排序的步长,步长gap每次减半,直到减到1*/{   for(i=gap;i=0)(v[j]v[j+gap]);j-=gap){temp=v[j];v[j]=v[j+gap];v[j+gap]=temp;}   /*二分插入法*/   voidHalfInsertSort(inta[],intlen)   {   inti,j,temp;   intlow,high,mid;   for(i=1;itemp){   high=mid-1;   }   /*如果中间元素比当前元素小,但前元素要插入到中间元素的右侧*/   else   {   low=mid+1;   }   }/*找到当前元素的位置,在low和high之间*/   for(j=i-1;jhigh;j--)/*元素后移*/   {   a[j+1]=a[j];   }   a[high+1]=temp;/*插入*/   }   }   /*直接插入法*/   voidInsertionSort(intinput[],intlen)   {   inti,j,temp;   for(i=1;i-1input[j]temp;j--)   {   input[j+1]=input[j];/*一边找一边移动元素*/   input[j]=temp;   }   }   }   四.带哨兵的直接排序法   /**   *带哨兵的直接插入排序,数组的第一个元素不用于存储有效数据   *将input[0]作为哨兵,可以避免判定input[j]中,数组是否越界   *因为在j--的过程中,当j减小到0时,变成了input[0]与input[0]   *自身进行比较,很明显这个时候说明位置i之前的数字都比input[i]小   *位置i上的数字不需要移动,直接进入下一轮的插入比较。   */   voidInsertionSortWithPiquet(intinput[],intlen)   {   inti,j;   /*保证数组input第一元素的存储数据无效,从第二个数据开始与它前面的元素比较*/for(i=2;iinput[0];j--)   {   input[j+1]=input[j];   input[j]=input[0];/*input[j]一直都是排序的元素中最大的那一个*/}   }   }   五.冒泡法   /*冒泡排序法*/   voidBublesort(inta[],intn)   {   inti,j,k;   for(j=0;ja[i+1])/*把值比较大的元素沉到底*/{k=a[i];a[i]=a[i+1];a[i+1]=k;}   插入排序   1.直接插入排序   原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。   要点:设立哨兵,作为临时存储和判断数组边界之用。实现:   VoidInsertSort(NodeL[],intlength)   {Inti,j;//分别为有序区和无序区指针   for(i=1;i=1)//直到增量缩小为1{   Shell(L,d);   d=d/2;//缩小增量   }   }   VoidShell(NodeL[],intd)   {   Inti,j;   For(i=d+1;i0L[j]L[0])   {   L[j+d]=L[j];//移动   j=j-d;//查找}L[j+d]=L[0];   }   }   }交换排序   1.冒泡排序   原理:将序列划分为无序和有序区,不断通过交换较大元素至无序区尾完成排序。要点:设计交换判断条件,提前结束以排好序的序列循环。   实现:   VoidBubbleSort(NodeL[])   {Inti,j;   Boolischanged;//设计跳出条件   For(j=n;jL[i+1])//如果发现较重元素就向后移动   {   Inttemp=L[i];   L[i]=L[i+1];   L[i+1]=temp;   Ischanged=true;}}   If(!ischanged)//若没有移动则说明序列已经有序,直接跳出   Break;   }   }2.快速排序   原理:不断寻找一个序列的中点,然后对中点左右的序列递归的进行排序,直至全部序列排序完成,使用了分治的思想。   要点:递归、分治   实现:

文档评论(0)

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

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

1亿VIP精品文档

相关文档