归并排序(递归)
public void mergeSort(int[] arr) {
if (arr == null || arr.length < 2)
return;
process(arr, 0, arr.length - 1);
}
private void process(int[] arr, int l, int r) {
if (l == r)
return;
int mid = l + ((r - l) >> 1);
process(arr, l, mid);
process(arr, mid + 1, r);
merge(arr, l, mid, r);
}
private void merge(int[] arr, int l, int mid, int r) {
int[] help = new int[r - l + 1];
int i = 0, p1 = l, p2 = mid + 1;
while (p1 <= mid && p2 <= r) {
help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= mid)
help[i++] = arr[p1++];
while (p2 <= r)
help[i++] = arr[p2++];
for (i = 0; i < help.length; i++)
arr[l + i] = help[i];
}
归并排序(迭代)
public void mergeSort(int[] arr) {
if (arr == null || arr.length < 2)
return;
int N = arr.length, mergeSize = 1;
while (mergeSize < N) {
int l = 0;
while (l < N) {
if (mergeSize >= N - l)
break;
int mid = l + mergeSize - 1;
int r = mid + Math.min(mergeSize, N - mid - 1);
merge(arr, l, mid, r);
l = r + 1;
}
if (mergeSize > N / 2)
break;
mergeSize <<= 1;
}
}