1. 程式人生 > >歸併排序(Merging Sort)- java實現

歸併排序(Merging Sort)- java實現

學習自嚴蔚敏、吳偉民的《資料結構》-清華大學出版

歸併排序(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-路歸併排序法進行內部排序。