归并算法 递归及非递归实现(Java)

递归实现

    public void mergeSortRecursion(int[] nums, int left, int right){
        if (left < right){
            int mid = (left + right) / 2;
            mergeSortRecursion(nums,left, mid);
            mergeSortRecursion(nums, mid + 1, right);
            merge(nums, left, mid, right);
        }
    }

    public void merge(int []nums, int left, int mid, int right){
        int i = left;
        int j = mid + 1;
        int k = left;
        int[] temp = new int[nums.length];
        while(i <= mid || j <= right){
            if (j > right || (i <= mid && nums[i] < nums[j])){
                temp[k++] = nums[i++];
            }else{
                temp[k++] = nums[j++];
            }
        }
        k = left;
        while(k <= right){
            nums[k] = temp[k];
            k++;
        }
    }

非递归实现

    public void mergeSort(int []nums){
        int length = nums.length;
        int[] src = nums;
        int[] dst = new int[length];

        for(int seg = 1; seg < length; seg += seg){
            for(int start = 0; start < length; start += seg * 2){
                int mid = Math.min(start + seg, length);
                int end = Math.min(start + 2 * seg, length);
                int i = start, j = mid, k = start;
                while(i < mid || j < end){
                    if (j == end || (i < mid && src[i] < src[j])){
                        dst[k++] = src[i++];
                    }else{
                        dst[k++] = src[j++];
                    }
                }
            }
            int [] temp = src;
            src = dst;
            dst = temp;
        }
    }
posted @ 2022-05-28 21:45  叶拂衣  阅读(41)  评论(0)    收藏  举报