欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

归并排序

程序员文章站 2022-05-10 17:19:14
...
//归并排序
public class MergeSort {
    public static void mergeSort(int[] arr) {
        if(arr == null || arr.length < 2) {
            return;
        }
        mergeSort(arr, 0, arr.length - 1);
    }

    public static void mergeSort(int[] arr, int l, int r) {
        if (l == r) {
            return;
        }
        int mid = l + ((r - l) >> 1);
        mergeSort(arr, l , mid);
        mergeSort(arr, mid+1, r);
        merge(arr, l, mid, r);
    }

    public static void merge(int[] arr, int l, int m, int r) {
        int[] help = new int[r - l + 1];
        int i = 0;
        int p1 = l;
        int p2 = m+1;
        while(p1 <= m && p2 <= r) {
            help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
        }
        while (p1 <= m) {
            help[i++] = arr[p1++];
        }
        while (p2 <= r) {
            help[i++] = arr[p2++];
        }
        for(i=0; i < help.length; i ++) {
            arr[l + i] = help[i];
        }
    }
}

思路:先让数组左边右边分别有序,再调用merge让整体有序。
merge过程会创建一个辅助数组,定义p1,p2两个指针分别指向左右第一个数,在比较两个指针指向的值,小的放进辅助数组,如果一个指针指向了末尾,则将另一个数组剩下的数全放进辅助数组。归并排序因为使用了一个辅助数组,故空间复杂度为O(N)

相关标签: 归并