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

    一.归并排序原理

      1.拆分(以二分归并排序为例:将一个数组折半拆分为两个数组,直到不可拆分)

      2.比较(元素之间两两进行比较)

      3.归并(元素比较完成后进行合并)

      用百度百科的一张图更加方便地理解:

        

      归并排序是一种稳定的排序算法,但是用到了递归,比较消耗内存。

    二.归并排序时间复杂度分析

      归并排序的时间复杂度包括分解,比较,合并。

      最好的情况下,数组是已排序的,那么归并排序的时间复杂度为O(n)级的。

      最坏的情况下,数组是逆序的,那么归并排序的时间复杂度为O(nlogn)级的。归并排序的平均时间复杂度是O(nlogn)

    三.代码实现(Java)

    package json.study;
    
    import java.util.Arrays;
    
    public class Test05 {
        static int number=0;
        public static void main(String[] args) {
            int[] arr = {9,8,7,5,6,1,2,3,4};
            cutAndSort(arr);
            System.out.println(Arrays.toString(arr));
        }
    
        private static void cutAndSort(int[] arr) {
            cutAndSort(arr, 0, arr.length - 1);
        }
    
        private static void cutAndSort(int[] arr, int left, int right) {//方法重载,用递归方法折半拆分数组并排序
            //如果数组只有一个元素则直接退出,否则
            if(left==right)
                return;
        
            int mid = (left + right) / 2;
            cutAndSort(arr, left, mid);//左边排好序后的数组
            cutAndSort(arr, mid + 1, right);//右边排好序后的数组
            merge(arr, left, mid, right);
    
        }
    
    
        private static void merge(int[] arr, int left, int mid, int right) {
        
            int[] tmp = new int[arr.length];
            int rIndex = mid + 1;
            int tIndex = left;
            int cIndex = left;
            while(left <=mid && rIndex <= right) {
                if (arr[left] <= arr[rIndex]) 
                    tmp[tIndex++] = arr[left++];
                else
                    tmp[tIndex++] = arr[rIndex++];
            }
                // 将左边剩余的归并
                while (left <=mid) {
                    tmp[tIndex++] = arr[left++];
                }
                // 将右边剩余的归并
                while (rIndex <= right) {
                    tmp[tIndex++] = arr[rIndex++];
                }
                 while(cIndex<=right){
                        arr[cIndex]=tmp[cIndex];
                        cIndex++;
                    }
            }
        
    
        }

      测试结果如下:

        

  • 相关阅读:
    C++(四)--线程与进程
    http1.0升级到http1.1
    odoo 基础
    Ubuntu 上安装配置 Ldap
    odoo 怎样使代码生效
    Odoo 创建自定义模块
    开源的软件应用
    域控
    Flask 数据库 SQLAlchemy
    CentOS 8 防火墙 firewall 相关命令
  • 原文地址:https://www.cnblogs.com/ywb-articles/p/10706849.html
Copyright © 2011-2022 走看看