合并排序优化算法

public class Solution {
    @Test
    public void testFunction() {
        int[] arr = {9,8,7,6,5,4,3,2,1};
        mergeSort(arr);
        for (int x : arr) {
            System.out.print(x + "  ");
        }

    }

    // 归并排序-递归
    // 首先选择中间的位置mid,然后对[l,mid],[mid+1,r]分别进行归并排序
    // 最后利用一个新数组存储上面的两部分结果,再对这部分进行排序
    // 优化:arr[mid] < arr[mid+1]时,本身是有序的,无需进行合并    
    public void mergeSort(int[] arr) {
        merge_sort(arr, 0, arr.length - 1);
    }

    private void merge_sort(int[] arr, int l, int r) {
        if (l == r) {
            return;
        }
        int mid = (l + r) / 2;
        merge_sort(arr, l, mid);
        merge_sort(arr, mid + 1, r);
        merge(arr, l, r, mid);
    }

    private void merge(int[] arr, int l, int r, int mid) {
        if (l == r) {
            return;
        }
        int[] temp = new int[r - l + 1];
        for (int i = l; i <= r; i++) {
            temp[i - l] = arr[i];
        }

        int first = 0;
        int flag = mid - l;
        int next = flag + 1;
        if (arr[mid] < arr[mid+1]) {
            return;
        }
        int i = l;
        while (first <= flag && next <= r-l) {

            if (first <= flag && temp[first] < temp[next]) {
                arr[i] = temp[first];
                first++;
            } else if (next <= r && temp[first] >= temp[next]) {
                arr[i] = temp[next];
                next++;
            }
            i++;

        }
        while (first <= flag) {
            arr[i] = temp[first];
            i++;
            first++;
        }
        while (next <= r-l) {
            arr[i] = temp[next];
            i++;
            next++;
        }

    }

}


//在r-l<15时,可以选择插入排序

猜你喜欢

转载自blog.csdn.net/wwzheng16/article/details/80413217
今日推荐