歸併排序的java實現(超詳解)
阿新 • • 發佈:2018-11-07
歸併排序,見名知意,就是遞迴+合併
原理:
使用遞迴的手段,達到分割的目的,在分割後進行合併,合併也是遞迴的,這就是這裡的雙向過程都是遞迴進行的,結果如圖:
示例(例項):
以一下一串數字為例,首先進行拆分,然後合併,在合併的過程,進行排序,這裡需要說明的是,遞迴在整個過程中都是存在的,不是單單拆分和合並存在遞迴。特別是在合併的過程中的排序不是那麼簡單,在採用專門合併兩個有序陣列的方式進行合併排序,後面把程式碼貼出來,怎麼能夠保證我們需要排序的兩個陣列是有序的呢?這裡就特別巧妙的運用遞迴進行拆分,拆分到最小單位時的陣列肯定能夠保證是有序的,特別巧妙,而且排序的過程仔細就回發現,如果給出的不是有序陣列,那麼不能保證排序的結果是真正有序的,過程看不懂沒有關係,看下程式碼就能明白。
程式碼1(這個程式碼是粘的這篇部落格的:https://blog.csdn.net/u014672511/article/details/80593436):
package order; import java.util.Arrays; public class merge2Arr { public static int[] merge2Arr(int[] arr1, int[] arr2) { int len1 = arr1.length; int len2 = arr2.length; int[] res = new int[len1 + len2]; int i = 0, j = 0, k = 0; while(i < len1 && j < len2) { res[k++] = arr1[i] < arr2[j]? arr1[i++] : arr2[j++]; } while(i < len1) { res[k++] = arr1[i++]; } while(j < len2) { res[k++] = arr2[j++]; } return res; } public static void main(String[] args) { int[] arr1= {1,4,76,5,3}; int[] arr2={5,66,76,3,9}; int[] aaa=merge2Arr(arr1, arr2); System.out.println(Arrays.toString(aaa)); } }
歸併排序的全程式碼:
package order; import java.util.Arrays; public class _merge2 { public static void merge(int[] a, int low,int mid,int high) { //建立左右兩個陣列 int[] L=new int[mid-low+1]; int[] R=new int[high-mid]; //給左右陣列賦值 int i1,j1; for (i1= 0,j1=low; i1< L.length; i1++) L[i1]=a[j1++]; int i2,j2; for (i2= 0,j2=mid+1; i2< R.length; i2++) R[i2]=a[j2++]; //拿來放臨時資料 int[] temp=new int[high-low+1]; int i3=0; int j3=0; int k1=0; while (i3<L.length&&j3<R.length) { if (L[i3]<R[j3]) { temp[k1++]=L[i3++]; }else { temp[k1++]=R[j3++]; } } //放剩下未放完的左資料(此時右資料已經放完) if (i3<mid-low+1&&j3>=high-mid) { for (int j5= i3; j5 <mid-low+1; j5++,k1++) { temp[k1]=L[j5]; } } //放剩下未放完的右資料(此時左資料已經放完) if (j3<high-mid&&i3>=mid-low+1) { for (int i5= j3; i5 <high-mid; i5++,k1++) { temp[k1]=R[i5]; } } if (k1<=high ) { for (int j4 = 0; j4 < temp.length; j4++) { a[j4]=temp[j4]; } } } public static void mergeSort(int[] a,int lo,int hig) { if (lo<hig) { int mid=(hig+lo)/2; int[] Le=new int[mid+1]; int[] Ri=new int[hig-mid]; mergeSort(Le,lo,mid); mergeSort(Ri,mid+1,hig); merge(a, lo, mid, hig); } } //測試一下 public static void main(String[] args) { int[] aa= {22,5,3,3,8,3,0,5,6,11}; mergeSort(aa,0,aa.length-1); System.out.println(Arrays.toString(aa)); } }