java原地归并排序(inplace)

/* 
 * 原地归并
 */
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;
        }
    }

    // swap [bias, bias+headSize) and [bias+headSize, bias+headSize+endSize)
    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++];
        }
        // (原[l, r]范围的内容被复制回原数组)  
        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);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值