java原地归并排序(inplace)

来源:互联网 发布:如何修改淘宝店名 编辑:程序博客网 时间:2024/05/22 08:25
/*  * 原地归并 */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);        }    }
原创粉丝点击