- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
冒泡排序可以说是最简单的排序了。我们学习C语言循环的时候都会提到。可见这是一种浅而易懂的排序算法!但不见得这种算法就没用处。首先,他很容易理解,这样在各种教材中比较适合拿来“开门见山”。其次是他很稳定。 若明确知道即将排的数字很混乱,随机性很强,则用冒泡排序也未偿不可。 谁让他始终是O(n^2)呢。冒泡排序法代码:void?BubbleSort(int?a[],int?l)?2{?3????for(int?i?=?0;?i?l;++i)?4????{?5????????for(int?j?=?i+1;?j?l;?++j)?6????????{?7????????????if(a[j]a[i])?8????????????{?9????????????????int?t?=?a[i];10????????????????a[i]?=?a[j];11????????????????a[j]?=?t;12????????????}13????????}14????}15}
从中我们可以看到,每次都会将后面的L-(i+1)个数拿来和a[i]比较,然后将小一点的换到前面。有人就觉得啊,这个每次都交换很费性能,影响效率。所以他们就将a[j]和a[i]比较后的最小值的下标记下来,当比较完之后,最后记下的下标就是最小的值的下标,然后再进行一次交换。于是便有了选择排序法。选择排序法代码:
?1void?SelectSort(int?a[],int?l)?2{?3????for(int?i?=?0;?i?l;?++i)?4????{?5????????int?k=i;?6????????for(int?j?=?i+1;?jl;++j)?7????????{?8?????????????9????????????if(a[j]a[k])10????????????{11????????????????k=j;12????????????}13????????}14????????int?t?=?a[i];15????????a[i]=a[k];16????????a[k]=?t;17????}18}
虽然,我们并没有根本性地扭转冒泡排序的地位。但效率是有明显提升的,至少减少了L*(L-1)-L = L*(L-2) = L^2 - 2*L次交换!另外,目前广为使用的快速排序和选择排序联合使用,也会有意想不到的提升!众所周知,当用快速排序法排序时,划分到很细的时候,明显很亏。 比如:两三个数排序却要划分成两堆,这样很划不来。所以,我们可以设定一个阀值,当快速排序划分到一定粒度的时候,便采用选择排序。 至于这个阀值,可以通过performace来测试,以得到一个“最优值”
?1void?QSort(int?a[],int?l,int?r)?2{?3????int?p;?4????if(lr)?5????{?6????????if(l-r=?DEFINE_NUMBER)?7????????????SelectSort(a,l,r);?8????????else?9????????{10????????????p?=?Partition(a,l,r);11????????????QSort(a,l,p-1);12????????????QSort(a,p+1,r);13????????}14????}15}
文档评论(0)