排序和检索.docVIP

  1. 1、本文档共16页,可阅读全部内容。
  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文档。上传文档
查看更多
排序和检索

排序和检索 目录 一 引言 二 三种代价为O(N2)的排序算法 2.1插入排序 2.2 Shell排序 2.3选择排序 2.4 冒泡排序 三 三种代价为O(NlogN)的排序算法 3.1快速排序 3.2 归并排序 3.3堆排序 3.4 二叉排序树 BST的平衡化 四 “O(N)”的基数排序 五 后序 附 测试数据说明 引言 这篇报告的写作源自于这些天我与Jcw关于排序算法的讨论。于是便有了总结一下它们的想法。于是便诞生了这篇无前缀修饰形容词的报告。 报告中主要介绍的是几种比较常用的排序法,包括了“四”种O(N2),“四”种O(NlogN),和一种O(N)的算法。另外纠正了一些我以前对排序算法的错误认识,更正了以前程序中的冗余部分。最近很喜欢重新翻写以前的程序,所以顺便把排序算法完全重写了一遍。这也是因为我载到了一份很不错的数据包,需要一套比较好的代码进行对比评测。 在每一个算法后,我都顺带了它的主过程代码,包括了Pascal和C++的代码。C++的代码有很大的概率会出现一些错误,但是我力争使这些错误不能影响到程序的阅读;Pascal代码是我的编程语言,所有代码均经过测试,但不保证它们是最优的编写形式。 由于之前我看过了算法导论、算法艺术、算法分析等书籍,所以难免会受其影响。 而如果全文知识仅仅是围绕这几个排序算法,那么就连yuhc这样的菜鸟也是不耻于写作的。所以我在第二部分添加了快排、归并等优化方法,也略述了BST的旋转原理。对于排序算法,仅仅是对其思想作一两句话的叙述。 在此要感谢Jcw、MMK的帮助、代码和测试,Wyx的参与和支持,还有Wasltone的测试数据。 希冀多年之后,看到这篇报告的学弟学妹们,可以惊叹道:“这就是当年Jcw、MMK、Wyx三位神牛和yuhc菜鸟的讨论成果啊!” - yuhc 三种代价为O(N2)的排序算法 2.1插入排序 在这里我们从插入排序说起,因为它在许多地方都有很重要的应用,也顺带可以引出2.2 ShellSort,由此为下一部分的归并排序潜意识中打下一个基础。 插入排序的思想是在一个有序队列中,插入一个元素,使之仍然是有序的。这可以用朴素的查找,也可以用同样朴素的二分。下面的程序给出了朴素的查找插入。 插入排序的最佳情况是O(N),当且仅当输入顺序是递增的(对于递增排序而言),此时交换次数为0。平均以及最差情况是O(N2)。在测试中插入排序得到了60分,是二次代价排序算法中最高的,这是因为它对特殊数据(递增数据)有“特殊”的排序方法。 //Pascal Code procedure inssort; begin read(array[1]); for i := 2 to n do begin read(key); j := i - 1; while (j > 0) and (array[j] > key) do begin array[j+1] := array[j]; dec(j); end; array[j+1] := key; end; end; //C++ Code Void inssort(ELEM * array, int n) { for (int i = 1; i < n; i++) for (int j = 1; (j > 0) && (key(array[j]) < key(array[j-1])); j--) swap(array[j], array[j-1]); } 2.2 Shell排序 Shell排序是插入排序的一个组合式优化。又被称为缩小增量排序法(Diminishing Increment Sort)。在初三的时候,MMK给我讲过这个排序,只是当时没有理解。现在看来,Shell排序只是利用了插入排序最优情况下O(N)复杂度的优点,将数组元素均等分成若干个互不相连的子序列,然后分别对子序列进行插入排序。随后的几轮排序,将数组元素均分成含有更少元素的组,再进行插入排序。这样,每进行一轮Shell排序,序列就变得更加有序。 Shell排序的效率与增量有关,选取(…,121,40,13,4,1)时效果比较好。选择2k时几乎没有多少作用。在测试中我采用了3k的增量序列,得到了比朴素插入排序更低的效率。通常情况下,它的时间复杂度是O(N1.5)。 MMK不愧是神牛,参照了她的Shellsort,我使得我的程序得以很大程度的优化。具体的是在实行插入排序时减少了一重循环。 //Pascal Code procedure inssort2(n,incr :lon

文档评论(0)

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

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

1亿VIP精品文档

相关文档