wmf_2010 2021-08-22 19:27 采纳率: 100%
浏览 26
已结题

关于#c++#的问题,请各位专家解答!



#include <bits/stdc++.h>
using namespace std;
typedef int LL;
const LL maxn = 100000 + 100;
LL a[maxn],b[maxn];
void mergesort( LL l,LL r ){
    if( l >= r ) return;
    LL mid = l + r >> 1;
    mergesort( l,mid );
    mergesort( mid+1,r );
    LL ll = l,rr = mid+1;
    LL cnt = 0;
    while( ll <= mid && rr <= r  ){
        if( a[ll] <= a[rr] ){
            b[++cnt] = a[ll];
            ll++;
        }else{
            b[++cnt] = a[rr];
            rr++;
        }
    }
    while( ll <= mid ) b[++cnt] = a[ll++];
    while( rr <= r ) b[++cnt] = a[rr++];
    for( LL i = l;i <= r;i++ ){
        a[i] = b[1+i-l];
    }
}
int main()
{
    LL n;
    scanf("%d",&n);
    for( LL i = 1;i <= n;i++ ){
        scanf("%d",&a[i]);
    }
    mergesort( 1,n );
    for( LL i = 1;i <= n;i++ ){
        printf("%d ",a[i]);
    }
    return 0;
}
#include <cstdio>
#include <algorithm>
#define N 100005
using namespace std;
int n;
int a[N];
void Qsort(int l,int r){
    if(l>=r) return;
    int i=l,j=r,mid=a[(l+r)>>1];
    while(i<=j) {
        while(a[i]<mid)i++;
        while(a[j]>mid)j--;
        if(i<=j)swap(a[i++],a[j--]);
    }
    Qsort(l,j);Qsort(i,r);
}
int main() {
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    Qsort(1,n);
    for(int i=1;i<=n;i++) printf("%d ",a[i]);
    return 0;
} 
#include<bits/stdc++.h>
using namespace std;
int a[100005]; 
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        //插入a[i],创建堆
        //第i个输入的数结点下标是i,往上浮
        int xb=i;
        while(xb>1&&a[xb]<a[xb/2]){
            //交换
            int k=a[xb];
            a[xb]=a[xb/2];
            a[xb/2]=k;
            xb/=2; 
        } 
    }
//    for(int i=1;i<=n;i++)cout<<a[i]<<endl;
    //提取n次根
    int jd=n;//结点总数为n 
    for(int i=1;i<=n;i++){
        //做n次
        //提取根
        cout<<a[1]<<" ";//输出当前根
        //提出最后一个作为新根
        a[1]=a[jd];
        jd--;
        //往下沉
        int xb=1;
        while((xb*2<=jd&&a[xb]>a[xb*2])||(xb*2+1<=jd&&a[xb]>a[xb*2+1])){
            int fx,lc=xb*2,rc=xb*2+1;
            if(rc<=jd&&a[rc]<a[lc])fx=rc; 
            else fx=lc;
            //交换
            int k=a[xb];
            a[xb]=a[fx];
            a[fx]=k;
            xb=fx;
        }
    //    for(int i=1;i<=jd;i++)cout<<a[i]<<" ";
    //    cout<<endl;
    } 
    return 0;
}

还有那些快排方法?

  • 写回答

1条回答 默认 最新

  • 六年级初中生 2021-08-22 19:52
    关注

    sort

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月20日
  • 已采纳回答 9月12日
  • 创建了问题 8月22日

悬赏问题

  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作