思路
归并排序是用的分治思想。让左右两部分先有序,然后将左右两个有序部分合并为新的有序部分。
如何让左右两部分有序:接着分左右部分。
实现
public static void mergeSort(int[] arr, int start, int end) {
if (arr == null || arr.length < 2) return;
if (start < end) {
int mid = start + (end - start) / 2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
merge(arr, start, mid, end);
}
}
private static void merge(int[] arr, int start, int mid, int end) {
int[] temp = new int[end - start + 1];
int p1 = start, p2 = mid + 1, index = 0;
while (p1 <= mid && p2 <= end) {
temp[index++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= mid) temp[index++] = arr[p1++];
while (p2 <= end) temp[index++] = arr[p2++];
if (temp.length >= 0) System.arraycopy(temp, 0, arr, start + 0, temp.length);
}
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
mergeSort(arr, 0, arr.length - 1);
for (int num : arr) {
System.out.print(num + " ");
}
}
- 时间复杂度:O(nlogn)
- 空间复杂度:O(N)
- 稳定