0
点赞
收藏
分享

微信扫一扫

java.归并排序

朱悟能_9ad4 2022-02-15 阅读 70

 

 

//归并排序   O(nlogn) S(n) 稳定
public class MergeSort extends Sort {
    public MergeSort(int[] arr) {
        super(arr);
    }

    @Override
    public void sort() {
        mergeSort(0, arr.length - 1);
    }

    private void mergeSort(int L, int R) {
        if (L >= R) {
            return;
        }
        int mid = (L + R) / 2;
        //递归排序当前层级
        mergeSort(L, mid);//递归左边
        mergeSort(mid + 1, R);//递归右边

        //左右排序完,合并
        //特殊 如果左边的最大值arr[mid]小于等于右边的最小值arr[mid+1] 则不需要合并
        if (arr[mid] > arr[mid + 1]) {
            merge(L, mid, R);
        }
    }

    private void merge(int L, int mid, int R) {
        int[] aux = new int[R - L + 1];
        //复制当前层原数组内容给aux
        for (int k = L; k <= R; k++) {
            aux[k - L] = arr[k];
        }
        int i = L;
        int j = mid + 1;
        for (int k = L; k <= R; k++) {
            if (i > mid) {  //左边完毕了
                arr[k] = aux[j - L];
                j++;
            } else if (j > R) {//右边完毕了
                arr[k] = aux[i - L];
                i++;
            } else if (aux[i - L] < aux[j - L]) {
                arr[k] = aux[i - L];
                i++;
            } else {
                arr[k] = aux[j - L];
                j++;
            }
        }
    }
}
举报

相关推荐

0 条评论