我最喜欢的排序算法 快速排序和归并排序.doc

我最喜欢的排序算法 快速排序和归并排序.doc

ID:50775081

大小:34.70 KB

页数:8页

时间:2020-03-14

我最喜欢的排序算法  快速排序和归并排序.doc_第1页
我最喜欢的排序算法  快速排序和归并排序.doc_第2页
我最喜欢的排序算法  快速排序和归并排序.doc_第3页
我最喜欢的排序算法  快速排序和归并排序.doc_第4页
我最喜欢的排序算法  快速排序和归并排序.doc_第5页
资源描述:

《我最喜欢的排序算法 快速排序和归并排序.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、我最喜欢的排序算法快速排序和归并排序我最喜欢的排序算法--快速排序和归并排序2011-02-0520:35摘要:一般评判排序算法的标准有时间代价,空间代价和稳定性。本文主要讨论性质相对比较好且作者喜欢的快速排序算法和归并排序算法,并对此这做了一定比较。正文:常见的排序算法大致分为四类:1.插入排序:直接插入排序,Shell排序2.选择排序:直接选择排序,堆排序3.交换排序:冒泡排序,快速排序4.归并排序而对排序算法的一般评判标准有:时间代价:比较次数、移动次数空间代价:额外空间、堆栈深度稳定性:存在多个具有相

2、同排序码的记录排序后这些记录的相对次序保持不变下面我们先用这些评判标准对这些算法做一下基本评价:从这个表中可以看出,快速排序、归并排序和堆排序的时间代价是比较小的,而其他几个的时间代价相对比较大。我们知道时间复杂度是评判一个算法的最主要标准。程序运行速度直接关系着算法的可行性。而真正美妙的算法也必定是运行速度比较快的。然而,由于现在计算机硬件的发展,尤其是多级缓存的引入,导致堆排序在实际运行中并不快。而且堆排序算法相对比较难理解,程序实现也相对困难,这样的算法显然不是美妙的算法。至少在快速排序面前很难找到优势

3、。而对于快速排序和归并排序,我们先做一简单介绍,然后分别分析,最后对比分析。快速排序:算法思想:以第一个元素为准,小于该元素的放在左边,不小于该元素的放在右边,然后对两侧元素递归排序。算法:voidquicksort(intl,intu){inti,m;if(l=u)return;m=l;for(i=l+1;i=u;i++)if(x[i]x[l])swap(++m,i);swap(l,m);quicksort(l,m-1);quicksort(m+1,u);}这里假设x为全局变量。改进:快速排序有一个很大不足

4、就是对于比较有序的数组排序效率很低,而且当数组较短时快速排序并不是最快的。应对这些情况有三种简单常用的改进:随机化改进:不是选取第一个值为基准,而是随机选取。平衡化改进:取第一个、最后一个和中间点三个值中中间值为基准进行排序。设置阀值--混合排序:当数组长度小于某一值时使用其他较快的排序。算法分析:时间代价:最好情况是O(nlogn),最坏情况是O(n2)。如果设f(n)为数组长为n时的比较次数,则f(n)=[(f(1)+f(n-1))+(f(2)+f(n-2))+.+(f(n-1)+f(1))]/n.利用数

5、学知识易知f(n)=(n+1)*[1/2+1/3+.+1/(n+1)]-2n~1.386nlog(n).空间代价:程序所需的空间即为堆栈深度(用于存储l,u,m),所以空间代价为O(log(n))稳定性:快速排序时不稳定的,即不保序的。评价:快速排序的时间代价比较低,空间代价也比较低,算是时空代价相当好的算法。而且在下面的数值试验中也会发现,快速排序效率还是很好的。但是最大的不足使快速排序不稳定。比如在excel中进行排序,我们自然希望排序结果是稳定的(即相同的数排序后与原来的顺序相同)。归并排序:算法思想:

6、将长为的n序列分为长度相当的左右两列,分别排序,然后再合并。即先分后合。算法:voidmerge_sort(intl,intu){if(l+1=u){basic_merge_sort(l,u);return;}intc=(l+u)/2;merge_sort(l,c);merge_sort(++c,u);merge(l,u);}其中basic_nerge_sort算法为:voidbasic_merge_sort(intl,intu){if((u-l==1)&&(x[l]x[u]))swap(l,u);}其中的m

7、erge算法作用是:将两个有序的序列排成一个有序序列,算法如下:voidmerge(intl,intu){intc=(l+u)/2,j=c+1,i;for(i=l;i=u;i++)y[i]=x[i];i=l;while(l=c&&j=u){if(y[l]y[j])x[i++]=y[j++];elsex[i++]=y[l++];}while(l=c)x[i++]=y[l++];while(j=u)x[i++]=y[j++];}改进:归并排序使用时基本上使用的和这类似。算法分析:时间代价:设f(n)为数组长为n时

8、的比较次数,则f(n)=f(n/2)+f((n+1)/2)+n.则利用数学知识很容易看出f(n)为O(nlog(n))的。空间代价:归并排序所需空间除了堆栈深度以外还需要开长度为n的空间。所以归并排序的空间代价为O(n)。稳定性:由于归并排序中并没有使用出现对换,所以排序时稳定的。评价:归并排序时间代价是比较理想的,而且算法是稳定的,这个是很好的。但是不足的是排序的空间代价比较大,需要开一个与原数组

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。