归并的含义是将两个或两个以上的有序表组合成一个新的有序表,先看下图,体会一下归并排序的过程
归并排序的核心就是两两合并,代码如下:
public class 归并排序 {
static int[] tempt;
static void merge(int[] A, int low, int mid, int high) {
for (int k = low; k <= high; k++) {
tempt[k] = A[k];
}
int i = low, j = mid + 1;
int k = i;
for (; i <= mid && j <= high; k++) {
if (tempt[i] < tempt[j]) {
A[k] = tempt[i++];
} else {
A[k] = tempt[j++];
}
}
while (i <= mid) {
A[k] = tempt[i++];
}
while (j <= high) {
A[k] = tempt[j++];
}
}
static void mergeSort(int[] A, int low, int high) {
if (low < high) {
int mid = (low + high) / 2;
mergeSort(A, low, mid);
mergeSort(A, mid + 1, high);
merge(A, low, mid, high);
}
}
public static void main(String[] args) {
int[] A = {4, 2, 3, 1};
tempt = new int[A.length];
mergeSort(A, 0, A.length - 1);
for (int i : A) {
System.out.print(i + " ");
}
System.out.println();
}
}
2路归并排序算法的性能分析如下:
所谓2路归并是指两两合并
- 空间效率: Merge ()操作中,辅助空间刚好为n个单元,所以算法的空间复杂度为O(n)。
- 时间效率:每趟归并的时间复杂度为O(n),共需进行「logN|趟归并,所以算法的时间复杂度为O(nlog2n)。
- 稳定性:由于Merge ()操作不会改变相同关键字记录的相对次序,所以2路归并排序算法是一种稳定的排序方法。
注意:一般而言,对于N个元素进行k路归并排序时,排序的趟数m满足k^m=N,从而m=logN,又考虑到m为整数,所以m =「logN]。