7-3 排序 (大数据量)基于堆排序&归并排序 算法

前言:

基于上图可知,堆排序和归并排序 是一种情况相对来说比较好处理较大数据的算法的排序方法;可利用最大堆/最小堆的构建来进行排序;归并排序的好处是稳定,但是代码量较大


请编写程序对不超过50000个整数递增排序。

输入格式:

输入第一行一个正整数n,表示待排序的元素个数。第二行为n个整数,表示待排序的元素。n不超过50000。

输出格式:

输出为一行,表示排序结果,每个整数后一个空格。

输入样例:

5
5 4 3 2 1

输出样例:

1 2 3 4 5 

代码长度限制

16 KB

时间限制

1000 ms

内存限制

64 MB


 C++(稳定的sort函数)

C++中的sort函数的时间复杂度为O(nlogn)。它使用快速排序(Quick Sort)算法作为默认排序算法,而快速排序的时间复杂度通常为O(nlogn)。不过,在某些情况下,sort函数会使用堆排序(Heap Sort)或归并排序(Merge Sort),它们的时间复杂度也都为O(nlogn)。需要注意的是,sort函数的最坏时间复杂度为O(n^2),但这种情况非常罕见,只有在极端情况下才会出现。

#include<bits/stdc++.h>
using namespace std;

bool cmp(int x,int y)
{
    return x<y;
}

int main()
{
    int n;
    cin>>n;
    int a[n];
    int cnt=0;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        cnt++;
    }
    //稳定性排序
    //cmp函数,从小到大排序,如果大小相等的话,不会改变相对顺序
    stable_sort(a,a+n,cmp);

    for(int i=0;i<n;i++)
    {
        cout<<a[i]<<" ";
    }

    return 0;
}


C++ 堆排序算法

#include<bits/stdc++.h>
using namespace std;

int h[50010];
int n;

void down(int u)//堆排序,可用最大堆排序,或最小堆排序
    //其中 h[u*2]<h[t];h[u*2]<h[t] 则为最小堆下滤函数
    //h[u*2]>=h[t];h[u*2]>=h[t] 则为最大堆下滤函数
{
    int t=u;
    if( u*2<=n && h[u*2]<h[t] ) t=u*2;
    if(u*2 +1 <= n && h[u*2+1]<h[t] ) t=u*2+1;
    if(u!=t)
    {
        swap(h[u],h[t]);
        down(t);
    }
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>h[i];
    }

    // 构建最小堆
    for(int i=n/2;i;i--)
        down(i);

    //排序
    while(n)
    {
        cout<<h[1]<<" ";
        swap(h[1],h[n]);
        n--;
        down(1);
    }
    return 0;
}



C++ 归并排序算法

#include<bits/stdc++.h>
using namespace std;

int a[50010],tmp[50010];

void merge_sort(int left,int right)
{
    if(left>=right)return ;
    int mid=(left+right)>>1;//这里是位运算,效率更高,这里相当于 
    // mid=(left+right)/2;

    merge_sort(left,mid),merge_sort(mid+1,right);

    int k=0,i=left,j=mid+1;
    while(i<=mid&&j<=right)
    {
        if(a[i]<=a[j])tmp[k++]=a[i++];
        else tmp[k++]=a[j++];
    }
    while(i<=mid)tmp[k++]=a[i++];
    while(j<=right)tmp[k++]=a[j++];

    for(int i=left,j=0;i<=right;i++,j++)
        a[i]=tmp[j];
}



int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }

    merge_sort(0,n-1);

    for(int i=0;i<n;i++)
    {
        cout<<a[i]<<" ";
    }



    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

H._

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值