平顶山市建设委员会网站/郑州搜索引擎优化
在编写代码前,请大家看看归并排序的思想。
百度百科--归并排序
下面是根据这个思想而编写的算法。
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+" ");}}}
总结:排序算法是相对简单的。