歸併排序(MERGE-SORT)是創建在歸併操做上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個很是典型的應用。將已有序的子序列合併,獲得徹底有序的序列;即先使每一個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲二路歸併。算法
先將無序數組分割,通過排序,將兩個有序數組再拼接。數組
歸併排序的原理就是合併兩個有序數組。合併兩個有序數組的代碼:ide
private static void merge(int[] a, int left, int mid, int right) { int[] tmp = new int[a.length];//輔助數組 int p1 = left, p2 = mid + 1, k = left; while (p1 <= mid && p2 <= right) { if (a[p1] <= a[p2]) tmp[k++] = a[p1++]; else tmp[k++] = a[p2++]; } while (p1 <= mid) tmp[k++] = a[p1++];//若是第一個序列未檢測完,直接將後面全部元素加到合併的序列中 while (p2 <= right) tmp[k++] = a[p2++]; //複製回原數組 for (int i = left; i <= right; i++) a[i] = tmp[i]; }
public static void mergeSort(int[] a) { mergeSortInternal(a,0,a.length - 1); } private static void mergeSortInternal(int[] a, int start, int end) { if (start < end) { int mid = (start + end) / 2;//分割數組 mergeSortInternal(a, start, mid);//對左側子序列進行遞歸排序 mergeSortInternal(a, mid + 1, end);//對右側子序列進行遞歸排序 merge(a, start, mid, end);//合併 } }