美文网首页
分治法之归并排序

分治法之归并排序

作者: wsj1211 | 来源:发表于2022-04-20 15:37 被阅读0次

    已知n个元素的数组将数组排序后输出

    @ApiOperation(value="归并", notes="分治法-归并排序")
        @GetMapping(value = "/guibingSort")
        public int[] guibingsort() {
            // 归并排序
            // 问题 已知一个n个元素数值数组 排序后输出
            int[] s1 = {8,5,6,4,7,1,3,2};
            int[] s2 = new int[8];
            mergeSort(0,s1.length-1,s1,s2);
            return s1;
        }
    
        /**
         * 分
         * @param a
         * @param b
         */
        public void mergeSort(int a,int b,int[]s1,int[] s2){
            if (a>=b) return ;
            int mid = (a+b)/2;
            mergeSort(a,mid,s1,s2);
            mergeSort(mid+1,b,s1,s2);
            merge(a,mid,b,s1,s2);
    
        }
    
        /**
         * 合
         * @param low
         * @param mid
         * @param hight
         */
        public void merge(int low,int mid,int hight,int[] s1,int[] s2){
            int i= low, j=mid+1,k=low;
            // 比较两边将较小的先给s2
            while (i <=mid && j<=hight){
                if (s1[i]<s1[j]){
                    s2[k++] = s1[i++];
                }else {
                    s2[k++]=s1[j++];
                }
            }
            // 当其中一方走到头后 将另一方依序安排到s2后面
            while (i<=mid){
                s2[k++]=s1[i++];
            }
            while (j<=hight){
                s2[k++]=s1[j++];
            }
    //        将s2 从low到hight 复制给s1
            for (int l = low; l <= hight; l++) {
                s1[l]=s2[l];
            }
        }
    

    复杂度 O(nlogn)

    相关文章

      网友评论

          本文标题:分治法之归并排序

          本文链接:https://www.haomeiwen.com/subject/wlknsrtx.html