nlogn时间复杂度排序

归并排序

归并排序算法复杂度为nlogn,算法是先分后并

用递归来分,每次分二分之一(该部分时间复杂度logn)

合并的时候两数组依次比较加入新数组中(该部分时间复杂度为n)

#include<iostream>
using namespace std;
 int a[10240];///需要操作数组
 int b[10240];///存储数组

 void merge(int a[],int s,int m,int e,int tmp[])///合并数组
 {
    int pb=0;
    int p1=s,p2=m+1;///第二个的起始位置为第一个的结束位置的后一个
    while(p1<=m&&p2<=e){
        if(a[p1]<a[p2])///装入数组
            tmp[pb++]=a[p1++];
        else
            tmp[pb++]=a[p2++];
    }
    while(p1<=m)
        tmp[pb++]=a[p1++];
    while(p2<=e)
        tmp[pb++]=a[p2++];
    for(int i=0;i<e-s+1;i++)///将tmp装入a[]数组中
        a[s+i]=tmp[i];
 }

 void mergesort(int a[],int s,int e,int tmp[])///a为处理数组,b为存储数组,s为起始坐标,e为排序结束坐标
 {
    if(s<e)///如果分到s==e则停止递归
    {
        int m=s+(e-s)/2;
        mergesort(a,s,m,tmp);///处理前一半
        mergesort(a,m+1,e,tmp);///处理后一半
        merge(a,s,m,e,tmp);///处理完成后要合并
    }
 }

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;++i)
        cin>>a[i];
    mergesort(a,0,n-1,b);
    for(int i=0;i<n;++i)
        cout<<a[i]<<",";
    cout<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41183791/article/details/81087185