您的位置:首页 > 编程语言 > Java开发

用Java实现归并排序(Merge-Sort)算法

2006-07-21 14:41 609 查看
绪:最近在学习算法设计,教材是MIT的OCW课程IntroductiontoAlgorithms;其中的归并算法实现,花费了我大半天时间,最后才成功搞定.为了避免初学者少走弯路,特拿来与大家共享!

归并排序算法思想:

分而治之(divide-conquer);每个递归过程涉及三个步骤

第一,分解:把待排序的n个元素的序列分解成两个子序列,每个子序列包括n/2个元素.

第二,治理:对每个子序列分别调用归并排序MergeSort,进行递归操作.

第三,合并:合并两个排好序的子序列,生成排序结果.

教材上的伪码描述:

MERGE(A,p,q,r)
1n1←q-p+1//修改为n1←q-p
2n2←r-q//修改n2←r-q+1
3createarraysL[1‥n1+1]andR[1‥n2+1]
4fori←1ton1
5doL[i]←A[p+i-1]
6forj←1ton2
7doR[j]←A[q+j]
8L[n1+1]←∞
9R[n2+1]←∞
10i←1
11j←1
12fork←ptor
13doifL[i]≤R[j]
14thenA[k]←L[i]
15i←i+1
16elseA[k]←R[j]
17j←j+1

MERGE-SORT(A,p,r)
1ifp<r
2thenq←(p+r)/2
3MERGE-SORT(A,p,q)
4MERGE-SORT(A,q+1,r)
5MERGE(A,p,q,r)//修改为MERGE(A,p,q+1,r)



共有三个修改之处,按照教材中的描述结合Java数组下标从0开始的规定若修改为

MERGE(A,p,q,r)
1n1←q-p+1//修改为n1←q-p
2n2←r-q//修改n2←r-q
MERGE-SORT(A,p,r)
4MERGE-SORT(A,q+1,r)
程序不能正常运行,暂时还不太清楚问题出在什么地方,怀疑和编译器对递归算法的实现有关.

按我所修改的方法,其具体实现代码如下:


packageorg.chw;

publicclassMergeSortAlgorithm{
finalstaticintMAXVALUE=10000;
staticint[]L;
staticint[]R;
publicstaticvoidMerge(int[]A,intp,intq,intr){
intn1=q-p;//correct
intn2=r-q+1;//correct
//intn1=q-p;
//intn2=r-q;
L=newint[n1+1];
R=newint[n2+1];
for(inti=0;i<n1;i++){
L[i]=A[p+i];
}
for(intj=0;j<n2;j++){
R[j]=A[q+j];
}L[n1]=MAXVALUE;
R[n2]=MAXVALUE;

inti=0,j=0;
for(intk=p;k<=r;k++){
//for(intk=p;k<r;k++){
if(L[i]<=R[j]){
A[k]=L[i];
i++;
}else{
A[k]=R[j];
j++;
}}}
publicstaticvoidMergeSort(int[]A,intp,intr){
intq;
if(p<r){
q=(p+r)/2;
/*correctness*/
MergeSort(A,p,q);
MergeSort(A,q+1,r);
Merge(A,p,q+1,r);
/*test*//*
MergeSort(A,p,q);
MergeSort(A,q,r);
Merge(A,p,q,r);*/
}}
publicstaticvoidmain(String[]args){

int[]inputArray={1,3,2,6,5,2,4,7,1,3,2,6,5,2,4,7,1,3,2,6,5,2,4,7,1,3};

MergeSort(inputArray,0,inputArray.length-1);

for(inti=0;i<inputArray.length;i++){
System.out.println("intArray["+i+"]="+inputArray[i]);
}}

}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: