zoukankan      html  css  js  c++  java
  • 归并排序(C++递归实现)

    归并排序算法采用的是分治算法,即把两个(或两个以上)有序表合并成一个新的有序表,即把待排序的序列分成若干个子序列,每个子序列都是有序的,然后把有序子序列合并成整体有序序列,这个过程也称为2-路归并.一般来说,n个数据大致会分为logN层,每层执行merge的总复杂度为O(n), 所以总的复杂度为O(nlogn)。

    归并排序包含不相邻元素的比较,但并不会直接交换。在合并两个已排序的数组时,如果遇到了相同的元素,只要保证前半部分数组优先于后半部分数组,相同元素的顺序就不会颠倒,所以归并排序属于稳定的排序算法。

    归并排序算法虽然高效且稳定,但在处理过程中除了用于 保存输入数据的数组外,还要临时占用一部分的内存空间。

    C++代码:

    #include<iostream>
    using namespace std;
    const int maxn=500000,INF=0x3f3f3f3f;
    int L[maxn/2+2],R[maxn/2+2];
    void merge(int a[],int n,int left,int mid,int right)
    {
        int n1=mid-left,n2=right-mid;
        for(int i=0;i<n1;i++)
            L[i]=a[left+i];
        for(int i=0;i<n2;i++)
            R[i]=a[mid+i];
        L[n1]=R[n2]=INF;
        int i=0,j=0;
        for(int k=left;k<right;k++)
        {
            if(L[i]<=R[j])
                a[k]=L[i++];
            else
                a[k]=R[j++];
        }
    }
    void mergesort(int a[],int n,int left,int right)
    {
        if(left+1<right)
        {
            int mid=(left+right)/2;
            mergesort(a,n,left,mid);
            mergesort(a,n,mid,right);
            merge(a,n,left,mid,right);
        }
    }
    int main()
    {
        int a[maxn],n;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        mergesort(a,n,0,n);
        for(int i=0;i<n;i++)
        {
            if(i)
                cout<<" ";
            cout<<a[i];
        }
        cout<<endl;
        return 0;
    }
    
  • 相关阅读:
    从一个表中查数据,插入另一个表
    sql 字段字符串内容替换
    安装VS2010后,如何设置老版本的项目文件不是默认用VS2010打开
    题解 [JOI 2019 Final] 独特的城市
    题解 [JOI 2019 Final] 硬币收藏
    题解 [CF720A] Closing ceremony
    [学习笔记] Miller-Rabin 质数测试
    题解 [CF332C] Students' Revenge
    题解 [CF525D] Arthur and Walls
    SpringMVC-拦截器
  • 原文地址:https://www.cnblogs.com/orion7/p/8242774.html
Copyright © 2011-2022 走看看