关于#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;
}

还有那些快排方法?

sort