zoukankan      html  css  js  c++  java
  • 005-排序算法-归并排序

    一、概述

      基本思想:采用分治法,将已有的有序子序列合并,得到一个完整的有序序列

    排序方法时间复杂度(平均)时间复杂度 (最坏)时间复杂度(最好)空间复杂度稳定性
    归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定

    分治算法

      分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。

      分治算法的一般步骤:

      (1)分解,将要解决的问题划分成若干规模较小的同类问题;

      (2)求解,当子问题划分得足够小时,用较简单的方法解决;

      (3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

    1.1、算法说明

      

      下图更加能够说明分治法

        

    1.2、算法实现

      将长度为 n 的序列分成两个长度为 2/n 的子序列,然后对着两个子序列进行归并排序,子序列又被分成子序列再进行归并排序,最终对有序子序列进行归并,得到最终的有序序列。 

      根据具体的实现,归并排序包括"从上往下"和"从下往上"2种方式。

        public static int[] mergeSort(int[] nums, int l, int h) {
            if (l == h)
                return new int[] { nums[l] };
    
            int mid = l + (h - l) / 2;//从中间拆分
            int[] leftArr = mergeSort(nums, l, mid); //左有序数组 拆分
            int[] rightArr = mergeSort(nums, mid + 1, h); //右有序数组 拆分
            int[] newNum = new int[leftArr.length + rightArr.length]; //新有序数组
    
            int m = 0, i = 0, j = 0;
            while (i < leftArr.length && j < rightArr.length) {
                newNum[m++] = leftArr[i] < rightArr[j] ? leftArr[i++] : rightArr[j++];
            }
            while (i < leftArr.length)
                newNum[m++] = leftArr[i++];
            while (j < rightArr.length)
                newNum[m++] = rightArr[j++];
            return newNum;
        }

    代码地址:地址 中的algorithm-001-sort中 MergeSort   

  • 相关阅读:
    Arduino学习笔记 (五) -- 红外接收与解码
    Arduino学习笔记 (四) -- 常用函数
    VSCode 基础必备插件
    Arduino学习笔记 (三) -- 语言基本概念
    Arduino学习笔记 (二) -- 常见板型
    Arduino学习笔记 (一) -- 概述
    一个好玩的东西:页面点击鼠标左键显示浮动文字
    Python多线程
    Nginx配置转发
    阿里云(CentOs)搭建SVN服务
  • 原文地址:https://www.cnblogs.com/bjlhx/p/10936644.html
Copyright © 2011-2022 走看看