• 归并排序学习


    https://blog.csdn.net/qq_25827845/article/details/70994874

    1.总体思想,就是分治

     关于时间复杂度我一直都很迷,但是看了实现之后,就明白了,merge的时间复杂度是O(n)因为,有O(logn)层吧,所以时间复杂度就是两者相乘。

    #还是不理解,抽象,先死记一下。

    因为在merge的时候需要创建一个新数组来保存有序的排列,所以空间复杂度为O(n)。

    import java.util.Arrays;
     
    public class Test {  
        // 归并排序的实现  
        public static void main(String[] args) {  
      
            int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4, -3};  
            System.out.println(Arrays.toString(nums));  
            sort(nums, 0, nums.length-1);  
            System.out.println(Arrays.toString(nums));  
        }
        
        /** 
         * 归并排序 
         * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,
         *     每个子序列是有序的。然后再把有序子序列合并为整体有序序列 
         * 时间复杂度为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;
        }
        private static void merge(int[] nums, int low, int mid, int high) {
        // 定义一个辅助数组,所以该算法的空间复杂度为O(n)
            int[] temp = new int[high-low+1];
            int i = low;
            int j = mid+1;
            int k = 0;
            // 找出较小值元素放入temp数组中
            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++];
            }
            // 使用temp中的元素覆盖nums中元素
            for (int k2 = 0; k2 < temp.length; k2++) {
                nums[k2+low] = temp[k2];
            }
        }
    }  
     
  • 相关阅读:
    linux常用命令(持续更新)
    nginx和redis
    网络编程BIO、NIO、AIO
    同步和异步、阻塞和非阻塞
    执行一条sql语句过程
    InnoDB 的B+树索引原理
    InnoDB 为啥要选择B+树来存储数据
    MySQL数据库引擎简介
    java并发编程(同步、同步容器、线程池)
    putty登录linux遭refuse
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/12449413.html
Copyright © 2020-2023  润新知