- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 各种排序方法的比较 排序算法之间的比较主要考虑以下几个方面∶ 算法的时间复杂度 算法的辅助空间 排序的稳定性 算法结构的复杂性 参加排序的数据的规模 排序码的初始状态 各种排序算法的时间复杂度与辅助空间及算法的稳定性如下表所示 * 算法评价-2 当数据规模n较小时,n2和nlog2n的差别不大,则采用简单的排序方法比较合适 如直接插入排序或直接选择排序等 由于直接插入排序法所需记录的移动较多,当对空间的要求不多时,可以采用表插入排序法减少记录的移动 当文件的初态已基本有序时,可选择简单的排序方法 如直接插入排序或起泡排序等 * 算法评价-3 当数据规模n较大时,应选用速度快的排序算法 快速排序法最快,被认为是目前基于比较的排序方法中最好的方法 当待排序的记录是随机分布时,快速排序的平均时间最短。但快速排序有可能出现最坏情况,则快速排序算法的时间复杂度为O(n2),且递归深度为n,即所需栈空间为O(n) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 此后,再对前n-1个记录进行同样处理,使n-1个记录的最大者被安置在整个序列的第n-1个位置上。 然后再对前n-2个记录重复上述过程……,这样最多做n-1次起泡就能完成排序 可以设置一个标志noswap表示本次起泡是否有记录交换,如果没有交换则表示整个排序过程完成 起泡排序是通过相邻记录之间的比较与交换,使值较大的记录逐步从前(上)向后(下)移,值较小的记录逐步从后(下)向前(上)移,就像水底的气泡一样向上冒,故称为起泡排序 起泡排序方法 * 若文件初状为正序,则一趟起泡就可完成排序,排序码的比较次数为n-1,且没有记录移动,时间复杂度是O(n) 若文件初态为逆序,则需要n-1趟起泡,每趟进行n-i次排序码的比较,且每次比较都移动三次,比较和移动次数均达到最大值∶ 起泡排序的算法评价 * 起泡排序的算法评价(续) 起泡排序最好时间复杂度是O(n) 起泡排序最坏时间复杂度为O(n2) 起泡排序平均时间复杂度为O(n2) 起泡排序算法中增加一个辅助空间temp,辅助空间为S(n)=O(1) 起泡排序是稳定的 * 归并排序(merge sort) 归并排序的基本操作是将两个或两个以上的记录有序序列归并为一个有序序列。 最简单的情况是:只含一个记录的序列显然是个有序序列,经过逐趟归并使整个序列中的有序子序列的长度逐趟增大,直至整个记录序列为有序序列止。 * 归并排序(merge sort) 88 14 98 25 62 52 79 30 23 31 Divide and Conquer * Merge Sort 88 14 98 25 62 52 79 30 23 31 Split Set into Two (no real work) 25,31,52,88,98 Get one friend to sort the first half. 14,23,30,62,79 Get one friend to sort the second half. * Merge Sort Merge two sorted lists into one 25,31,52,88,98 14,23,30,62,79 14,23,25,30,31,52,62,79,88,98 * * 二路归并算法的基本思路: 两组归并算法merge: 按low,m,high归并两组记录。结果放于low,high之间。 void merge(RecordNode* r, RecordNode *r1, int low, int m, int high) 一趟归并算法mergePass: 两两归并长度为length的一组记录: void mergePass(RecordNode *r, RecordNode *r1, int n, int length) * 具有n个记录的文件排序,必须做?log2n? 趟归并,每趟归并所花费的时间是O(n) 二路归并排序算法的时间复杂度为T(n)=O(nlog2n) 算法中增加了一个数组record,算法的辅助空间为S(n)=O(n) 二路归并排序是稳定的 算法评价 * Quicksort * Quicksort (cont.) Divide: Partition (rearrange) the array A
文档评论(0)