Java程式碼實現歸併排序
阿新 • • 發佈:2018-12-10
Java程式碼實現歸併排序
歸併排序(Merge Sort)
思路:如果要排序一個數組,我們先把陣列從中間分成前後兩部分,然後對前後兩部分分別排序,再將排好序的兩部分合並在一起,這樣整個陣列就都有序了。
所以說歸併排序的核心思想是排序和合並兩個有序陣列,這個規程需要用遞迴來實現。
核心思想:
- 將陣列拆分為兩個陣列,然後對兩個陣列各自進行排序。
- 合併兩個排好序的陣列。
需要注意的是,對子陣列進行排序依然是使用歸併排序,所以這就涉及到了遞迴。
下面是Java程式碼的實現:
public class MergeSort { /** * 歸併排序 * * @param a 待排序的陣列 * @param n 陣列大小 */ public static void mergeSort(int[] a, int n) { mergeSortRecursion(a, 0, n - 1); } /** * 遞迴呼叫的函式 * * @param a * @param p * @param r */ public static void mergeSortRecursion(int[] a, int p, int r) { // 遞迴終止條件 if (p >= r) { return; } // 取p到r之間的位置q int q = p + (r - p) / 2; // 分治遞迴 mergeSortRecursion(a, p, q); mergeSortRecursion(a, q + 1, r); // 將A[p...q]和A[q+1...r]合併為A[p...r] merge(a, p, q, r); } /** * 合併兩個有序陣列 * * @param a 合併好的有序陣列,需要放到這個位置上。 * @param p * @param q * @param r */ public static void merge(int[] a, int p, int q, int r) { int i = p; int j = q + 1; int k = 0; int[] tmp = new int[r - p + 1]; // 最少把一個數組中的資料取完。 while (i <= q && j <= r) { if (a[i] <= a[j]) { tmp[k++] = a[i++]; } else { tmp[k++] = a[j++]; } } // 判斷哪個子陣列中有剩餘的資料。 int start = i; int end = q; if (j <= r) { start = j; end = r; } // 將剩餘的資料copy到臨時陣列 tmp。 while (start <= end) { tmp[k++] = a[start++]; } //將 tmp 中的資料拷貝回 a 中 System.arraycopy(tmp, 0, a, p, r - p + 1); } }
測試程式碼如下:
public void onBtnTest5Clicked() { int size = 10; if (size <= 0) { throw new IllegalArgumentException("size cannot bo lower than 0"); } int[] a = SortUtils.generateRandomArray(size, 100); System.out.println("歸併排序:"); System.out.println(SortUtils.getArrayToString(a)); MergeSort.mergeSort(a, size); System.out.println(SortUtils.getArrayToString(a)); System.out.println(); }
輸出結果:符合期望
I/System.out: 歸併排序:
I/System.out: [78,33,20,43,22,71,40,93,20,50]
I/System.out: [20,20,22,33,40,43,50,71,78,93]
完整程式碼請檢視
專案中搜索MergeSort即可。
github傳送門 https://github.com/tinyvampirepudge/DataStructureDemo