歸併排序(Merging Sort)- java實現
阿新 • • 發佈:2018-12-08
學習自嚴蔚敏、吳偉民的《資料結構》-清華大學出版
歸併排序(Merging Sort)是又一類不同的排序方法。“歸併”的含義是將兩個或兩個以上的有序表組合成一個新的有序表。
利用歸併的思想容易實現排序。假設初始化序列含有n個記錄,則可以看成是n個有序的子序列,每個子序列的長度為1,然後兩兩歸併,得到[n/2]個長度為2或1的有序序列;再兩兩歸併……直到得到一個長度為n的有序序列為止,這種歸併排序方法成為2-路歸併排序。
public static void merge(int[] arr, int start, int mid, int end) { int[] newArr = Arrays.copyOf(arr, arr.length); int i = start, j = mid + 1, k = start; for (; i <= mid && j <= end; k++) { if (newArr[i] < newArr[j]) { arr[k] = newArr[i++]; } else { arr[k] = newArr[j++]; } } while (i <= mid) { arr[k++] = newArr[i++]; } while (j <= end) { arr[k++] = newArr[j++]; } }
public static void mSort(int[] arr, int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
mSort(arr, start, mid);
mSort(arr, mid + 1, end);
merge(arr, start, mid, end);
}
}
提示:遞迴形式的演算法在形式上較簡潔,但實用性很差。
與快速排序和堆排序相比,歸併排序的最大特點是,它是一種穩定的排序方法。但在一般情況下,很少利用2-路歸併排序法進行內部排序。