用Java实现归并排序(Merge-Sort)算法
2006-07-21 14:41
609 查看
绪:最近在学习算法设计,教材是MIT的OCW课程IntroductiontoAlgorithms;其中的归并算法实现,花费了我大半天时间,最后才成功搞定.为了避免初学者少走弯路,特拿来与大家共享!
归并排序算法思想:
分而治之(divide-conquer);每个递归过程涉及三个步骤
第一,分解:把待排序的n个元素的序列分解成两个子序列,每个子序列包括n/2个元素.
第二,治理:对每个子序列分别调用归并排序MergeSort,进行递归操作.
第三,合并:合并两个排好序的子序列,生成排序结果.
教材上的伪码描述:
归并排序算法思想:
分而治之(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]);
}}
}
相关文章推荐
- MergeSort(归并排序)算法Java实现
- Java实现归并排序(Merge-Sort)算法
- Java 归并排序(MergeSort)算法实现
- Java实现算法归并排序(MergeSort)
- 归并排序(merge sort)算法实现
- 归并排序(merge sort)算法实现
- 归并排序(Mergesort)之Java实现
- 归并排序(MergeSort)Java实现
- 算法第三次作业(1. 排序。对文件 largeW.txt(下载链接)中的数据,编程实现冒泡排序(方法名:bubbleSort) 与 归并排序(mergeSort),把排序后的结果分别保存到largeW
- 归并排序(merge sort)算法实现
- 归并排序(Mergesort)之Java实现
- 归并排序(Mergesort)之Java实现
- 归并排序(Merge Sort)递归、非递归 Java实现
- [算法]MergeSort的Java实现
- 归并排序(merge sort)算法实现
- 【算法导论学习-002】归并排序(MergeSort)
- 一步步学习数据结构和算法之归并排序效率分析及java实现
- 归并排序(merge sort)的实现
- Java排序算法(三)--归并排序(MergeSort)递归与非递归的实现
- Java堆排序(HeapSort)算法实现