分治技术在排序算法中的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分治技术在排序算法中的应用
【摘要】讲述了运用分治技术的思想实现排序算法中的归并排序、快速排序两种排序算法,然后对两种排序算法的效率进行了比较,得出了采用分治技术的排序算法是比较有效的算法。
【关键词】分治技术;排序算法;归并排序;快速排序
排序是计算机科学中经常遇到的工作,是程序设计中的一种重要运算,它的功能是将一个数据元素(或记录)的任意序列,重新排列成某个按关键字有序的序列。分治技术的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。如果在排序算法中巧妙得应用分治技术,可以使排序算法更具艺术性。本文就排序算法中的归并排序和快速排序如何应用分治技术做简
单的讲述。
1.归并排序
归并排序(mergesort)是第一个计算机排序方法,它是由john von nerman于1945年提出,是最能体现分治技术设计思路的算法之一。当待排元素n大于1时归并排序的步骤如下:
⑴将待排序列二分为长度为n/2的两个子序列。
⑵递归地对每一个子序列进行归并排序,直至n等于1。
⑶归并两个排好的有序子序列。
设一初始序列:49 38 65 97 76 13 27,对该序列实行归并排序过程如下:
初始序列:[49] [38] [65] [97] [76] [13] [27]
第一步:[38 49] [65 97] [13 76] [27]
第二步:[38 49 65 97] [13 27 76]
第三步:[13 27 38 49 65 76 97]
归并排序用代码描述如下:
算法mergesort:
template〈typename t〉
void mergesort(t a[],int left,int right)
{
t *b=new t [right—left];//bo 辅助数组
if (left〈right〉//至少有2个元素
{
int mid=(left+right)/2;//取中点
mergesort(a,left,mid);
mergesort(a,mid+1,right);
merge(a,b,left,mid,right);//合并到数组b
copy(a,left,right); //复制回数组a
}
}
其中,算法merge()合并两个排好序的数组到一个新的数组中,用代码表示merge()如下:
template 〈typename t〉
void merge(t a[],t b[],int 1,int m,int r)
{
int i=1,j=m+1,k=1;
while((ielse b[k++]=a[j++];
}
if(i>m)
{
for(int q=j;q求解(常为递归)—>合并”的流程来进行设计的,是一个典型的分治算法。
2.快速排序
快速排序是由c.a.e hoare于1962年提出的,至今被认为是最好的排序算法。“计算机科学与工程(comprting science &engineering)”杂志将快速排序算法列为20世纪在科学和工程的开发与应用中最有影响的10个算法之一。它也是一种基于分治技术的排序算法,也是按“划分->求解—>合并”的思路来设计的。不过快速排序中的划分不再是平衡的二爹妈,它是以待排序的任一元素(常为首元素,常称为“枢轴”)为界限,分成大于该元素的部分和小于该元素的部分,然后再递归地解决该两部分的一种高效算法。
我们首先分析快速排序中的“划分”方法。划分的目的在于划分后使得一个元素处于一个正确的位置(该元素前面所有元素均小于后面所有元素)。要达到这个目的,方法是多样的,有的需要较多
辅助空间,有的需要较少辅助空间。有的快一点,有的慢一点,这里给出一种所需辅助空间较小,而又较快的方法:
算法 split:
template
int split(t a[],int low,int high)
{
int i=low,x=a[low];
for(int j=low+1;j
void qaort(t a[],int left,int right)
{
if(left求解(常为递归)—>合并”的思路来设计的,只不过快速排序中对划分后的子序列是直接就地排序的,未引入辅助数组,因此合并的过程较为简单,只是栈中函数调用的简单返回,几乎不需要进行任何其它运算。
综上,归并排序和快速排序都是分治技术在排序中的应用。但两者在设计过程中的侧重点不同,归并排序侧重于分治中的“合并”步骤;而快速排序则侧重于“划分”步骤。但两者都很好的体现了分治技术的思想。
【参考文献】
[1]王晓东.计算机算法设计与分析(第三版)[m].北京:电子工业出版社,2007.
[2]赵凯辉.基于分治与递归策略的快速排序算法.株洲师范高
等师范学校学报,2004,02.