学习自严蔚敏、吴伟民的《数据结构》-清华大学出版
归并排序(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-路归并排序法进行内部排序。