public class InPlaceMergeSort {
private static void reverse(int[] arr, int i, int j) {
while(i < j)
{
int temp = arr[i];
arr[i++] = arr[j];
arr[j--] = temp;
}
}
private static void swapAdjacentBlocks(int arr[], int bias, int oneSize, int anotherSize) {
reverse(arr, bias, bias + oneSize - 1);
reverse(arr, bias + oneSize, bias + oneSize + anotherSize - 1);
reverse(arr, bias, bias + oneSize + anotherSize - 1);
}
private static void inplaceMerge(int arr[], int l, int mid, int r)
{
int i = l;
int j = mid + 1;
while(i < j && j <= r)
{
while(i < j && arr[i] <= arr[j])
{
i++;
}
int index = j;
while(j <= r && arr[j] <= arr[i])
{
j++;
}
swapAdjacentBlocks(arr, i, index-i, j-index);
i += (j-index);
}
}
public static void mergeSort(int arr[], int l, int r)
{
if(l < r)
{
int mid = (l + r) / 2;
mergeSort(arr, l, mid);
mergeSort(arr, mid + 1, r);
inplaceMerge(arr, l, mid, r);
}
}
private static void print(int[] arr) {
for (int i : arr) {
System.out.print(i+", ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {3,5,1,7,0,6,9,11};
mergeSort(arr, 0, arr.length-1);
print(arr);
}
}
new额外数组归并
/**
*
*/
private static void merge(int[] dest, int[] src, int l, int mid, int r) {
int i = l;
int p = l;
int q = mid + 1;
while (p <= mid && q <= r) {
if (src[p] <= src[q]) {
dest[i++] = src[p++];
} else {
dest[i++] = src[q++];
}
}
while (p <= mid) {
dest[i++] = src[p++];
}
while (q <= r) {
dest[i++] = src[q++];
}
i = l;
while (i <= r) {
src[i] = dest[i++];
}
}
public static void mergeSort(int[] dest, int[] src, int l, int r) {
if (l < r) {
int mid = (l + r) / 2;
mergeSort(dest, src, l, mid);
mergeSort(dest, src, mid + 1, r);
merge(dest, src, l, mid, r);
}
}