各种常用排序算法

上传人:子 文档编号:43442679 上传时间:2018-06-06 格式:DOC 页数:11 大小:34.50KB
返回 下载 相关 举报
各种常用排序算法_第1页
第1页 / 共11页
各种常用排序算法_第2页
第2页 / 共11页
各种常用排序算法_第3页
第3页 / 共11页
各种常用排序算法_第4页
第4页 / 共11页
各种常用排序算法_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《各种常用排序算法》由会员分享,可在线阅读,更多相关《各种常用排序算法(11页珍藏版)》请在金锄头文库上搜索。

1、各种常用排序算法各种常用排序算法排序所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。当待排序记录的关键字都不相同时,排序结果是惟一的,否则排序结果不惟一。在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生改变,则称这种排序方法是不稳定的。要注意的是,排序算法的稳定性是针对所有输入实例而言的。即在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。一.插入排序插入排序的基本思想是每步将一个待排序的记录按其排序码值的大小,插

2、到前面已经排好的文件中的适当位置,直到全部插入完为止。插入排序方法主要有直接插入排序和希尔排序。.直接插入排序(稳定)接插入排序的过程为:在插入第 i 个记录时,R1,R2,.Ri-1 已经排好序,将第 i 个记录的排序码 Ki 依次和 R1,R2,.,Ri-1 的排序码逐个进行比较,找到适当的位置。使用直接插入排序,对于具有n 个记录的文件,要进行 n-1 趟排序。代码如下:void Dir_Insert(int A,int N) /直接插入排序int j,t;for(int i=1;it)Aj+1=Aj;j-;Aj+1=t;.希尔排序(不稳定):希尔(Shell)排序的基本思想是:先取一个

3、小于 n 的整数 d1 作为第一个增量把文件的全部记录分成 d1 个组。所有距离为 d1 的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取得第二个增量 d2 0)for(j=k;j=0 i=i-k;Ai+k=t;if(k = 1) break;(k/2)%2 =0 ? k=k/2+1 : k=k/2;二.选择排序选择排序的基本思想是每步从待排序的记录中选出排序码最小的记录,顺序存放在已排序的记录序列的后面,直到全部排完。选择排序中主要使用直接选择排序和堆排序。.直接选择排序(不稳定)直接选择排序的过程是:首先在所有记录中选出序码最小的记录,把它与第 1 个记录交换,然后在其余的

4、记录内选出排序码最小的记录,与第 2 个记录交换.依次类推,直到所有记录排完为止。无论文件初始状态如何,在第 i 趟排序中选出最小关键字的记录,需要做 n-i 次比较,因此,总的比较次数为 n(n-1)/2=O(n2)。当初始文件为正序时,移动次数为 0;文件初态为反序时,每趟排序均要执行交换操作,总的移动次数取最大值 3(n-1)。直接选择排序的平均时间复杂度为 O(n2)。直接选择排序是不稳定的。代码如下:void Dir_Choose(int A,int n) /直接选择排序int k,t;for(int i=0;i=K2i 且 Ki=K2i+1),(1k2,则交换 k1 和 k2 所在

5、的记录,否则不交换。继续对 k2 和 k3 重复上述过程,直到处理完 kn-1和 kn。这时最大的排序码记录转到了最后位置,称第 1 次起泡,共执行 n-1 次比较。与第一步类似,从 k1 和 k2 开始比较,到 kn-2 和 kn-1 为止,共执行 n-2 次比较。依次类推,共做 n-1 次起泡,完成整个排序过程。若文件的初始状态是正序的,一趟扫描即可完成排序。所需关键字比较次数为 n-1 次,记录移动次数为 0。因此,冒泡排序最好的时间复杂度为 O(n)。若初始文件是反序的,需要进行 n-1 趟排序。每趟排序要进行n-i 次关键字的比较(1=t) h-;if(hl)temp=Al;Al=A

6、h;Ah=temp;Quick_Sort(A,low,l-1);Quick_Sort(A,l+1,high);四.归并排序归并排序是将两个或两个以上的有序子表合并成一个新的有序表。初始时,把含有 n 个结点的待排序序列看作由 n 个长度都为 1的有序子表组成,将它们依次两两归并得到长度为 2 的若干有序子表,再对它们两两合并。直到得到长度为 n 的有序表,排序结束。归并排序是一种稳定的排序,可用顺序存储结构,也易于在链表上实现,对长度为 n 的文件,需进行 log2n 趟二路归并,每趟归并的时间为 O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是 O(nlog2n)。归并排序需要

7、一个辅助向量来暂存两个有序子文件归并的结果,故其辅助空间复杂度为 O(n),显然它不是就地排序。代码略.五.基数排序设单关键字的每个分量的取值范围均是 C0=Kj=Crd-1(0=j=rd),可能的取值个数 rd 称为基数基数的选择和关键字的分解因关键字的类型而异(1).若关键字是十进制整数,则按个、十等位进行分解,基数rd=10,C0=0,C9=9,d 为最长整数的位数(2).若关键字是小写的英文字符串,则 rd=26,C0=a,C25=z,d为最长字符串的长度基数排序的基本思想是:从低位到高位依次对待排序的关键码进行分配和收集,经过 d 趟分配和收集,就可以得到一个有序序列按平均时间将排序

8、分为四类:(1)平方阶(O(n2)排序一般称为简单排序,例如直接插入、直接选择和冒泡排序;(2)线性对数阶(O(nlgn)排序如快速、堆和归并排序;(3)O(n1+)阶排序是介于 0 和 1 之间的常数,即 01,如希尔排序;(4)线性阶(O(n)排序如基数排序。各种排序方法比较简单排序中直接插入最好,快速排序最快,当文件为正序时,直接插入和冒泡均最佳。影响排序效果的因素因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法应综合考虑下列因素:待排序的记录数目 n;记录的大小(规模);关键字的结构及其初始状态;对稳定性的要求;语言工具的条件;存储结构;时间和辅助空间复杂度等。不同条

9、件下,排序方法的选择(1)若 n 较小(如 n50),可采用直接插入或直接选择排序。当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;(3)若 n 较大,则应采用时间复杂度为 O(nlgn)的排序方法:快速排序、堆排序或归并排序。快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。若要求排序稳定,则可选用归并排序。但从单个记录起进行两两归并的 排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号