• 二路归并排序java实现


    二路归并排序:
    其核心思想时将问题一分为二,并递归调用一分为二方法,使问题分割到不能再分各的原子问题,然后再归并,从实现原子问题开始,层层向上归并,最终解决整体问题。即所谓“分而治之,万流归一”


    二路归并排序的时间复杂度计算如下:

    参考资料:算法导论------递归算法的时间复杂度求解

    二路归并java实现:

     1 public class MergeSort {
     2     
     3     public static void main(String[] args) {
     4         int [] array = {1,8,6,7,2,4,11,17,6,48,3};
     5         //int [] array ={9,8,7,6,5,4,3,2,1};
     6         int [] temp = new int [array.length];
     7         sort(array, temp, 0, array.length - 1);
     8         System.out.println("排序后:");
     9         for (int i = 0; i < array.length; i++) {
    10             System.out.print(array[i] + " ");
    11         }
    12     }
    13     /**
    14      * 总的sort循环。先将问题一分为二,再将问题解决后的两个子问题结果合并
    15      * 要想清楚 子数组 边界的处理。
    16      * 如子数组为 下标为(k,k + 1):则再分解为(K),(K+1)。
    17      * 如子数组下标为(k,k+1,k+2):则分解为(k,k+1)和(k+2)。再递归调用分解(k,k+1)
    18      * @param array
    19      * @param temp
    20      * @param start
    21      * @param end
    22      */
    23     public static void sort (int [] array, int [] temp, int start, int end){
    24         if (start < end) {
    25             int mid = (start + end)/2;
    26             //解决左边子问题
    27             sort(array, temp, start, mid);
    28             //解决右边子问题
    29             sort(array, temp, mid + 1, end);
    30             //合并两个子问题
    31             merge(array,temp,start,end,mid);
    32         }
    33     }
    34     /**
    35      * 归并函数
    36      * @param array 原始数组
    37      * @param temp 辅助数组
    38      * @param start 归并开始坐标
    39      * @param end 归并结束坐标
    40      * @param mid = (start + end)/2
    41      */
    42     public static void merge(int[] array, int[] temp, int start, int end, int mid) {
    43         // TODO Auto-generated method stub
    44         //i:左子问题的操作下标; j:右子问题的操作下标
    45         int i = start;
    46         int j = mid + 1;
    47         int k = start;
    48         while (i <= mid && j <= end){
    49             if (array[i] < array[j]) {
    50                 temp[k] = array[i];
    51                 k++;
    52                 i++;
    53             }else {
    54                 temp[k] = array[j];
    55                 k++;
    56                 j++;
    57             }
    58         }    
    59         //左子数组还有元素
    60         while (i <= mid){
    61             temp[k] = array[i];
    62             k++;
    63             i++;
    64         }
    65         //右子数字还是元素
    66         while (j <= end){
    67             temp[k] = array[j];
    68             k++;
    69             j++;
    70         }
    71 
    72         //将辅助数组中排好序的元素复制到原数组
    73         //注意:辅助数组与原数组一一对应
    74         for (int index = start; index <= end; index ++){
    75             array[index] = temp[index];
    76             System.out.println("temp[" + index +"]" + "....." + temp[index]);
    77         }
    78         System.out.println("===============");
    79     }
    80 }

    通过控制台输出,我们可以看到排序的过程:

    temp[0].....1
    temp[1].....8
    ===============
    temp[0].....1
    temp[1].....6
    temp[2].....8
    ===============
    temp[3].....2
    temp[4].....7
    ===============
    temp[3].....2
    temp[4].....4
    temp[5].....7
    ===============
    temp[0].....1
    temp[1].....2
    temp[2].....4
    temp[3].....6
    temp[4].....7
    temp[5].....8
    ===============
    temp[6].....11
    temp[7].....17
    ===============
    temp[6].....6
    temp[7].....11
    temp[8].....17
    ===============
    temp[9].....3
    temp[10].....48
    ===============
    temp[6].....3
    temp[7].....6
    temp[8].....11
    temp[9].....17
    temp[10].....48
    ===============
    temp[0].....1
    temp[1].....2
    temp[2].....3
    temp[3].....4
    temp[4].....6
    temp[5].....6
    temp[6].....7
    temp[7].....8
    temp[8].....11
    temp[9].....17
    temp[10].....48
    ===============
    排序后:
    1 2 3 4 6 6 7 8 11 17 48 
  • 相关阅读:
    CDQ分治·学习笔记
    高斯消元板子
    [HEOI2012]朋友圈
    [CTSC2008]祭祀
    Medium | LeetCode 140. 单词拆分 II | 回溯(递归)
    Hard | LeetCode 212. 单词搜索 II | 回溯 + 前缀树
    Medium | LeetCode 131. 分割回文串 | 回溯 + 动态规划预处理
    Hard | LeetCode 329. 矩阵中的最长递增路径 | 矩阵+DFS
    Hard | LeetCode 76. 最小覆盖子串 | 滑动窗口
    Medium | LeetCode 130. 被围绕的区域 | 矩阵 + DFS
  • 原文地址:https://www.cnblogs.com/wtting/p/8970455.html
Copyright © 2020-2023  润新知