归并排序(Merge Sort)算法是一种分治思想的递归算法。
与快速排序算法不同的是,归并排序是先排序小数组再排序大数组,而快速排序是先处理大数组再处理小数组。
时间复杂度:
空间复杂度:
其中 n 是数组的长度。
排序算法步骤:
1 要排序的数组是a ,其元素数量为n ,设当前处理的数组长度m = 2
2 对所有长度为m的子数组进行归并(注意此时数组m的左半数组和右半数组是有序的)
2.1 申请长度为m的数组t作为额外空间
2.2 将左右两边的有序数组从小到大填到数组t中
2.3 将数组t中的元素复制回原数组a
3 若m >= n则直接结束,否则设m = m * 2,回到步骤2
java代码实现:
import java.util.Arrays;
public class MergeSort {
public static void mergeSort(int[] a) {
int[] t = new int[a.length];
mergeSort(a, 0, a.length - 1, t);
}
public static void mergeSort(int[] a, int left, int right, int[] t) {
if (left >= right) {
return;
}
int middle = (left + right) / 2;
mergeSort(a, left, middle, t);
mergeSort(a, middle + 1, right, t);
merge(a, left, middle, right, t);
}
public static void merge(int[] a, int left, int middle, int right, int[] t) {
for (int i = left, l = left, r = middle + 1; i <= right; i++) {
if (l > middle) {
t[i] = a[r++];
} else if (r > right) {
t[i] = a[l++];
} else if (a[l] <= a[r]) {
t[i] = a[l++];
} else { // a[l] > a[r]
t[i] = a[r++];
}
}
System.arraycopy(t, left, a, left, right - left + 1);
}
public static void main(String[] args) {
int[] a = new int[] { 3, 4, 2, 1, 5 };
mergeSort(a);
System.out.println(Arrays.toString(a));
}
}