合並排序算法是用分治策略實現對N個元素進行排序的算法。其基本思想是:
將待排序元素分成大小大致相同 的兩個子集合,分別 對兩個子集合進行排序,最終將排好序的子集合合並成所要求的排好序的集合。
重點:
1.分治的實現
2.合並的實現
分治,就是把整個集合的元素一直除2化分,一直化為到沒有兩個元素開始合並。
圖:
分治的時候比較簡單,一直除2遞歸就行了,合並的時候為了方便就借助另一個變化的數組來接收交換的數組,
合並的時候,兩個指標i、j,把值比較小的放入temp數組中,然后放入那個值的那一邊的指標自加,繼續比較。一直把值合部排完合並為一個數組,然后把temp數組復制回到原來數組就可以進入下一個遞歸。
完全代碼由下:
public class Merge { //遞歸分成小部分 public void merge_sort(int[] arrays,int start,int end){ if(start<end){ int m=(start+end)/2; merge_sort(arrays,start,m); merge_sort(arrays,m+1,end); combin_arrays(arrays,start,m,end); } } //合並數組 public void combin_arrays(int[] arrays,int start,int m,int end){ int length=end-start+1; int temp[]=new int[length];//用來存放比較的數組,用完復制回到原來的數組 int i=start; int j=m+1; int c=0; while(i<=m &&j<=end){ if(arrays[i]<arrays[j]){ temp[c]=arrays[i]; i++; c++; }else{ temp[c]=arrays[j]; j++; c++; } } while(i<=m){ temp[c]=arrays[i]; i++; } while(j<=end){ temp[c]=arrays[j]; j++; } c=0; for(int t=start;t<=end;t++,c++){ arrays[t]=temp[c]; } snp(arrays); } //打印數組 public void snp(int[] arrays){ for(int i=0;i<arrays.length;i++){ System.out.print(arrays[i]+" "); } System.out.println(); } public static void main(String[] args) { Merge m=new Merge(); int a[]={5,4,10,8,7,9}; m.merge_sort(a,0,a.length-1); } }
由有不對之處請大家指出,謝謝