- 1、本文档共107页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
排序算法汇编
前言
排序的目的绝大部份都是为了搜寻(但搜寻却并不一定用到排序),因此排序算是资讯人员的基本功,如果能用得好,程式的效率便会显着提升。本文的目的,便是说明各种排序演算法,从观念、效率、程式、到实测都加以列出,以供读者熟悉各种排序演算法的优劣与特点,进而在各种情况下,妥善运用这些演算法。
排序方法的分类,一般可分成三种。第一种是以资料所在媒介物做区分,例如Internal Sort指的是资料全部在记忆体中做排序,External Sort指的是资料无法全部载入记忆体,大部份资料仍存在外界媒体。由于这两种情况的排序法,考虑的因素完全不同,因此这种分法便成为本文的主分类。第二种是以资料处理的方式做区分,例如计数、插入、交换、挑选、合并、配发等等,这种分类法,便做为本文基础排序法的分类标准。第三种是以资料键值处理的方式做区分,例如键值完整比对、子键值处理等,这种分类法,本文并不采用。
读者若发现本文有任何错误,或是可补充之处,欢迎提出指正或加以补充。
-邱奕南,2005/8/28
第一章 Internal Sorting
一. 以计数(Counting)为基准的排序法
1.Comparison Counting Sort
Comparison Counting Sort的观念,是将资料两两相比,统计并记录各资料比该资料小的资料总数。也就是说,如果统计结果,某个资料都没有比它更小的资料,那么它对应的统计结果值会是0,也就是排在最前面(索引值=0),如果只有一个资料比它小的,那么统计结果值便是1,排在第2位(索引值=1),以此类推。藉由这个统计结果,我们便可以将资料排序好,不过必须额外用一个阵列,来记录这个统计结果值。
这个演算法的效率非常差,虽然还有许多改良的方法,但作者并不打算多加着墨,毕竟它的实用价值并不高。
void ComparisonCountingSort(int* data, int no, int *count)
//说明:Comparison Counting Sort
//输入:data = 输入资料, no = 资料数
//输出:count = 资料排序排名,数值0表第1位,以此类推
//效率:最差/平均状况均为O(n^2),需额外O(n)记忆体
//实测:(32,3.2us),(256,176us),(1K,2.83ms),(4K,45.0ms),(64K,11.8s),(256K,258s)
{
if (no = 1) return;
memset(count,0,no*sizeof(int));
// 资料两两相比,进行统计 //
for (int i=no-1; i=1; i--)
for (int j=i-1; j=0; j--)
if (data[i] data[j]) count[j]++;
else count[i]++;
}
另一种称为Rank Sort,为Comparison Counting Sort的变形,它省略了资料排名阵列,而在每一次需要时再去扫瞄资料算出,因此速度更慢。底下是Rank Sort的程式部份,但作者并不打算去实测它。
void RankSort(int* data, int no, int *out_data)
//说明:Rank Sort
//输入:data = 输入资料, no = 资料数
//输出:out_data = 已排好的资料
//效率:最差/平均状况均为O(n^2),需额外O(n)记忆体
//限制:输入资料键值不得重复
{
for (int i=no-1; i=0; i--)
{
int index = 0;
for (int j=no-1; j=0; j--)
if (data[i] data[j]) index++;
out_data[index] = data[i];
}
}
注意这个程式并没有考虑到键值相同的情况,因此并不实用。
2.Distribution Counting Sort
Distribution Counting Sort也是利用统计的方式来排序,不同的是,它是统计每个键值出现的频率,然后再依照键值出现的频率,重建出排序好的资料。其过程是,先扫瞄一遍资料,决定出最大与最小的键值,然后依此键值分布范围,另行配置一个频率阵列,用来表示各键值出现的频率。接着再扫瞄一遍资料,将统计结果记录到频率阵列里,最后便是按照频率阵列里的值,重新造出最后的排序结果。
Distribution Counting Sort的效率,取决于资料数量与delta(data)(即Max(data)-Min(data)),当键值分布很近,也就是delt
文档评论(0)