归并排序
递归形式
- 取中间值,将数组分为左右两部分。
- 对左右两部分,分别进行排序。
- 借助辅助数组,合并两部分。
public class MegerSort {
public static void main(String[] args) {
int[] arr = { 11, 2, 5, 8, 7, 6, 3, 9 };
sort(arr, 0, arr.length - 1);
for (int num : arr) {
System.out.print(num + " ");
}
}
private static void sort(int[] arr, int begin, int end) {
int[] helper = new int[arr.length];
megerSort(arr, helper, begin, end);
}
private static void megerSort(int[] arr, int[] helper, int begin, int end) {
if (begin >= end) {
return;
}
int mid = (begin + end) / 2;
megerSort(arr, helper, begin, mid);
megerSort(arr, helper, mid + 1, end);
meger(arr, helper, begin, mid + 1, end);
}
private static void merge(int[] arr, int[] helper, int left, int right, int end) {
for (int i = left; i <= end; i++) {
helper[i] = arr[i];
}
int index = left;
int mid = right - 1;
while (left <= mid && right <= end) {
if (helper[left] <= helper[right]) {
arr[index] = helper[left];
left++;
} else {
arr[index] = helper[right];
right++;
}
index++;
}
while (left <= mid) {
arr[index++] = helper[left++];
}
}
}
非递归形式
public static void sortNR(int[] arr) {
int[] helper = new int[arr.length];
int length = 1;
int n = arr.length;
while (length < n) {
mergeSortNR(arr, helper, n, length);
length *= 2;
mergeSortNR(helper, arr, n, length);
length *= 2;
}
}
private static void mergeSortNR(int[] arr, int[] helper, int n, int length) {
int i = 0;
for (i = 0; i <= n - 2 * length; i += 2 * length) {
mergeNR(arr, helper, i, i + length, i + 2 * length - 1);
}
if (i + length < n) {
mergeNR(arr, helper, i, i + length, n - 1);
} else {
for (int j = i; j < n; j++) {
helper[j] = arr[j];
}
}
}
private static void mergeNR(int[] arr, int[] helper, int left, int right, int end) {
int mid = right - 1;
int index = left;
while (left <= mid && right <= end) {
if (arr[left] <= arr[right]) {
helper[index] = arr[left];
left++;
} else {
helper[index] = arr[right];
right++;
}
index++;
}
while (left <= mid)
helper[index++] = arr[left++];
while (right <= end)
helper[index++] = arr[right++];
}