zoukankan      html  css  js  c++  java
  • [OI学习笔记]归并排序

    实现过程

      根据分治三步走策略,归并排序分为划分,递归,合并三个步骤

      复杂度O(N*log2N)

    划分

      把序列分成左右尽量等长的两半

    递归

      分别对左右两边进行归并排序

    合并

      问题是。。。怎么把两个有序序列合并成一个大的有序序列?(;′⌒`)

      合并策略:每次比较左右两个序列中最小的那一个,将更小的那个加入辅助空间(因为已经有序,所以若a<=b,则a一定<=b后面的数),然后再把辅助空间的有序序列复制回来即可。不难看出,需要辅助空间复杂度为O(N)。

    代码:

    void m_sort(int A[],int x,int y,int T[]){
        int m=x+(y-x)/2;
        int p=x,q=m,i=x;
        m_sort(A,x,m,T);
        m_sort(A,m,y,T);
        while(p<m||q<y){
            if(q>=y||(p<m&&A[p]<=A[q]))
                T[i++]=A[p++];//从左半复制 
            else 
                T[i++]=A[q++];//否则从右半复制
        }
        for(i=x;i<=y;i++)
            A[i]=T[i];
    } 

     

    本篇文章为SHINE_GEEK原创,转载请注明来源!
    written_by:SHINE_GEEK

    -------------------------------------
    签名:自己选的路,跪着也要走完;理想的实现,需要不懈奋斗!
    -------------------------------------
  • 相关阅读:
    第三部分:填写志愿的思路
    第二部分:志愿录取标准
    2017年浙江省高考志愿、录取闪电入门系列 目录
    七、程序包
    五、过程式编程和调试技巧
    四、表达式的计算
    三、函数与递归
    二、表操作
    一、MMA概述
    Java面向对象
  • 原文地址:https://www.cnblogs.com/sjrb/p/10294484.html
Copyright © 2011-2022 走看看