zoukankan      html  css  js  c++  java
  • 归并排序

    归并排序                                                                              

    归并排序是另一类不同的排序方法,所谓归并,就是把两个或者两个以上的有序表合并成一个新的有序表的过程。

    基本思想                                                                              

    将一个含有n个序列的有序表看成是n个长度为1的有序表,然后两两归并,得到[n/2]个长度为2的有序表,然后再两两归并,直到得到一个长度为n的有序表为止。

    example                                                                               

    初始值 【49】 【38】 【65】 【97】 【76】 【13】 【27】
    看成由长度为1的7个子序列组成
    第一次合并之后 【38 49】 【65 97】 【13 76】 【27】
    看成由长度为1或2的4个子序列组成
    第二次合并之后 【38 49 65 97】 【13 27 76】
    看成由长度为4或3的2个子序列组成
    第三次合并之后 【13 27 38 49 65 76 97】

    code                                                                                   

    public class MS_20140817 {
    
        public static void main(String[] args) {
            int num = 10;// 数组中有多少个元素
            int[] arr = new int[num];// 排序数组
            arr = Func.getArray(num);
            Func.printArray(arr);
            arr = MS_20140817.sort(arr, 0, arr.length-1); 
            Func.printArray(arr);
        }
        /** 
         * 归并排序 
         * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列 
         * 时间复杂度为O(nlogn) 
         * 稳定排序方式 
         * @param nums 待排序数组 
         * @return 输出有序数组 
         */  
        public static int[] sort(int[] nums, int low, int high) {  
            int mid = (low + high) / 2;  
            if (low < high) {  
                // 左边  
                sort(nums, low, mid);  
                // 右边  
                sort(nums, mid + 1, high);  
                // 左右归并  
                merge(nums, low, mid, high);  
            }  
            return nums;  
        }  
    
        public static void merge(int[] nums, int low, int mid, int high) {  
            int[] temp = new int[high - low + 1];  
            int i = low;// 左指针  
            int j = mid + 1;// 右指针  
            int k = 0;  
    
            // 把较小的数先移到新数组中  
            while (i <= mid && j <= high) {  
                if (nums[i] < nums[j]) {  
                    temp[k++] = nums[i++];  
                } else {  
                    temp[k++] = nums[j++];  
                }  
            }  
    
            // 把左边剩余的数移入数组  
            while (i <= mid) {  
                temp[k++] = nums[i++];  
            }  
    
            // 把右边边剩余的数移入数组  
            while (j <= high) {  
                temp[k++] = nums[j++];  
            }  
    
            // 把新数组中的数覆盖nums数组  
            for (int k2 = 0; k2 < temp.length; k2++) {  
                nums[k2 + low] = temp[k2];  
            }  
        }  
    
    }

    我是天王盖地虎的分割线                                                             

  • 相关阅读:
    express实现前后端通信上传图片,存储数据库(mysql)傻瓜教程(二)
    express实现前后端通信上传图片,存储数据库(mysql)傻瓜教程(一)
    [转载] 在阿里做了五年技术主管,我有话想说
    阿里云RDS MySql还原到本地Linux/Centos
    如何领域驱动设计?-实践感悟&总结分享
    jira + confluence 安装和破解
    RabbitMQ安装和配置
    [转]技术路线的选择重要但不具有决定性
    .Net core2.0日志组件Log4net、Nlog简单性能测试
    在微服务中使用领域事件
  • 原文地址:https://www.cnblogs.com/yydcdut/p/3917870.html
Copyright © 2011-2022 走看看