在编写代码前,请大家看看归并排序的思想。
下面是根据这个思想而编写的算法。
package MergeSort;
public class MergeSortMain {
public static void main(String[] args){
int[] theArr=new int[]{98,75,14,15,18,12,14,16,77,1,99,47};
MergeSortMain mysort= new MergeSortMain(theArr);
mysort.megerSort();
mysort.debugPrint();
}
private int[] _tmpArr;//--临时区域,为了避免操作原始数组导致结构变化,所以这里直接copy一个数组,然后操作这个数组。
private int[] _middle_result;
private int[] _originArr;
public MergeSortMain(int[] needSortedArray){
if(needSortedArray==null){
return;
}
_originArr=needSortedArray;
_tmpArr=new int[needSortedArray.length];
_middle_result=new int[needSortedArray.length];
int cindex=0;
for(int i:_originArr){
_tmpArr[cindex]=i;
cindex++;
}
}
public int[] megerSort(){
if(_tmpArr==null||_tmpArr.length<=1){
return _tmpArr;
}
if(_tmpArr.length==2){
recursion_division(0, 1);
return _tmpArr;
}
else{
recursion_division(0, _tmpArr.length-1);
return _tmpArr;
}
}
/**
* 递归处理归并排序。
* beginLoc===表示当前归并排序的左界,
* endloc表示右界,当左界=右界时,表示当前划分出来的是一个数,不用排序了。
* */
private void recursion_division(int beginLoc,int endLoc){
if(beginLoc>=endLoc){
return;
}
else if(endLoc-1==beginLoc){
meger_sort_division(beginLoc, beginLoc, endLoc, endLoc);
return;
}
int tmpLoc1= (int)Math.floor(((double)((beginLoc+endLoc)/2)));
recursion_division(beginLoc, tmpLoc1);
recursion_division(tmpLoc1+1, endLoc);
meger_sort_division(beginLoc, tmpLoc1, tmpLoc1+1, endLoc);
}
private void meger_sort_division(int beginLoc1,int endLoc1,int beginLoc2,int endLoc2){
if(beginLoc1<=endLoc1&&beginLoc1<=endLoc2&&beginLoc1<beginLoc2){
if(beginLoc1==endLoc1&&beginLoc2==endLoc2){
if(_tmpArr[beginLoc1]>_tmpArr[beginLoc2]){
int itmp=_tmpArr[beginLoc1];
_tmpArr[beginLoc1]=_tmpArr[beginLoc2];
_tmpArr[beginLoc2]=itmp;
}
debugPrint();
return;
}
else{
int theLength=endLoc2-beginLoc1+1;
int leftLoc=0;
int rightLoc=0;
int theCindex=0;
for(int cindex=0;cindex<theLength;cindex++){
if(beginLoc1+leftLoc>endLoc1||beginLoc2+rightLoc>endLoc2){
break;
}
if(_tmpArr[beginLoc1+leftLoc]<=_tmpArr[beginLoc2+rightLoc]){
_middle_result[cindex]=_tmpArr[beginLoc1+leftLoc];
leftLoc++;
theCindex=cindex;
continue;
}
else if(_tmpArr[beginLoc1+leftLoc]>_tmpArr[beginLoc2+rightLoc]){
_middle_result[cindex]=_tmpArr[beginLoc2+rightLoc];
rightLoc++;
theCindex=cindex;
continue;
}
}
/**
* 假如这个,表明出现了左边遍历完,右边没有遍历完;或者右边遍历完,左边没有遍历完的情况。
* */
if(theCindex<theLength-1){
if(beginLoc1+leftLoc<=endLoc1){
for(int cindex=beginLoc1+leftLoc;cindex<=endLoc1;cindex++){
_middle_result[theCindex+1]=_tmpArr[cindex];
theCindex++;
}
}
else if(beginLoc2+rightLoc<=endLoc2){
for(int cindex=beginLoc2+rightLoc;cindex<=endLoc2;cindex++){
_middle_result[theCindex+1]=_tmpArr[cindex];
theCindex++;
}
}
}
/**
* 将结果放回排序数组中。
* */
for(int cindex=0;cindex<theLength;cindex++){
_tmpArr[beginLoc1+cindex]=_middle_result[cindex];
}
debugPrint();
}
}
else{
return;
}
}
public void debugPrint(){
if(_tmpArr==null){
return;
}
System.out.println("");
System.out.print("合并结果:");
for(int i:_tmpArr){
System.out.print(" "+i+" ");
}
}
}
总结:排序算法是相对简单的。
本文深入探讨归并排序的基本思想,并通过代码实现展示了如何利用递归和临时数组完成排序过程。强调了排序算法的简单性和高效性。
1003

被折叠的 条评论
为什么被折叠?



