归并排序,主要思想是分治法。相当于两堆已排序好的扑克牌,每一次选择两堆牌顶上较小的那一个,放到合并堆。
最坏情况O(nlogn),平均情况O(nlogn)。
package chapter2;
public class mergeSort {
public static void main(String[] args) {
int[] arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * 100);
}
mergeSortFunction(arr, 0, 9);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
private static void mergeSortFunction(int[] arr, int p, int r) {
if (p < r) {
int q = (int) ((p + r) / 2);
mergeSortFunction(arr, p, q);
mergeSortFunction(arr, q + 1, r);
merge(arr, p, q, r);
}
}
private static void merge(int[] arr, int p, int q, int r) {
int[] arrLeft = new int[10];
for (int i = 0; i < q - p + 1; i++) {
arrLeft[i] = arr[p + i];
}
arrLeft[q - p + 1] = Integer.MAX_VALUE;
int[] arrRight = new int[10];
for (int j = 0; j < r - q; j++) {
arrRight[j] = arr[q + j + 1];
}
arrRight[r - q] = Integer.MAX_VALUE;
int n = 0;
int m = 0;
for (int k = p; k < r + 1; k++) {
if (arrLeft[n] < arrRight[m]) {
arr[k] = arrLeft[n];
n++;
} else {
arr[k] = arrRight[m];
m++;
}
}
}
}