排序算法一览

总述:

排序,初赛知识点之一,都敲了一遍,供初赛复习。

此处收录了10 9种常见排序算法。只给出部分程序代码,读入一律使用Rd函数,输出为Pf。


  1. 计数排序。稳定,复杂度 O(n+m)

    Rd(n);
    while(n--){
        Rd(x);
        cnt[x]++;
    }
    for(int i=1;i<=10;i++)
        for(int j=1;j<=cnt[i];j++)
            Pf(i);
  2. 选择排序。不稳定,复杂度 O(n2)

    Rd(n);
    for(int i=1;i<=n;i++)Rd(A[i]);
    for(int i=1;i<=n;i++){
        int t=i;
        for(int j=i+1;j<=n;j++)
            if(A[j]<A[t])t=j;
        swap(A[i],A[t]);
    }
    for(int i=1;i<=n;i++)
        Pf(A[i]);
  3. 冒泡排序。稳定,复杂度 O(n2) (实际为逆序对数)

    Rd(n);
    for(int i=1;i<=n;i++)Rd(A[i]);
    for(int i=1;i<=n;i++){
        bool flag=false;
        for(int j=n;j>i;j--)
            if(A[j-1]>A[j])swap(A[j-1],A[j]),flag=true;
        if(!flag)break;
    }
    for(int i=1;i<=n;i++)
        Pf(A[i]);
  4. 插入排序。稳定,复杂度 O(n2)

    Rd(n);
    A[0]=-INF;
    for(int i=1;i<=n;i++){
        Rd(x);
        for(int j=i-1;j>=0;j--){
            if(A[j]>x)A[j+1]=A[j];
            else{A[j+1]=x;break;}
        }
    }
    for(int i=1;i<=n;i++)
        Pf(A[i]);
  5. 基数排序。稳定,复杂度 O(nm)

    int d=1;
    Rd(n);
    for(int i=1;i<=n;i++)Rd(A[i]),A[i]+=Max;
    for(int i=0;i<=9;i++){
        for(int j=0;j<=9;j++)s[j][0]=0;
        for(int j=1;j<=n;j++){
            int k=A[j]/d%10;
            s[k][++s[k][0]]=A[j];
        }
        int m=0;
        for(int j=0;j<=9;j++)
            for(int k=1;k<=s[j][0];k++)
                A[++m]=s[j][k];
        d*=10;
    }
    for(int i=1;i<=n;i++)Pf(A[i]-Max);
  6. 归并排序。稳定,复杂度 O(nlogn)

    void Merge(int L,int R){
        if(L==R)return;
        int mid=(L+R)>>1;
        Merge(L,mid);
        Merge(mid+1,R);
        int i=L,j=mid+1,t=L;
        while(i<=mid&&j<=R){
        if(A[i]<A[j])T[t++]=A[i++];
                else T[t++]=A[j++];
        }
        while(i<=mid)T[t++]=A[i++];
        while(j<=R)T[t++]=A[j++];
        for(int i=L;i<=R;i++)A[i]=T[i];
    }
    int main(){
        int n;
        Rd(n);
        for(int i=1;i<=n;i++)Rd(A[i]);
        Merge(1,n);
        for(int i=1;i<=n;i++)Pf(A[i]);
        return 0;
    }
  7. 快速排序。不稳定,复杂度 O(nlogn)

    void Qsort(int L,int R){
        if(L>=R)return;
        int t=rand()%(R-L+1)+L;
        swap(A[L],A[t]);
        int tmp=A[L];
        int l=L,r=R;
        while(l<r){
            while(l<r&&A[r]>=tmp)r--;
            if(l<r)A[l]=A[r];
            while(l<r&&A[l]<=tmp)l++;
            if(l<r)A[r]=A[l];
        }
        A[l]=tmp;
        Qsort(L,l-1);
        Qsort(l+1,R);
    }
    int main(){
        srand(time(NULL));
        int n;
        Rd(n);
        for(int i=1;i<=n;i++)Rd(A[i]);
        Qsort(1,n);
        for(int i=1;i<=n;i++)Pf(A[i]);
        return 0;
    }
  8. 希尔排序。不稳定,复杂度 O(n1.5)

    Rd(n);
    for(int i=1;i<=n;i++)Rd(A[i]);
    for(int step=n/2;step>=1;step/=2)
        for(int i=step;i<=n;i++)
            if(A[i-step]>A[i]){
                int t=i-step,tmp=A[i];
                while(t>=1&&A[t]>tmp){
                    A[t+step]=A[t];
                    t-=step;
                }
                A[t+step]=tmp;
            }
    for(int i=1;i<=n;i++)Pf(A[i]);
  9. 堆排序。不稳定,复杂度 O(nlogn)

    void Up(int x){
        while((x>>1)>=1&&A[x>>1]>A[x]){
            swap(A[x>>1],A[x]);
            x>>=1;
        }
    }
    void Down(int x){
        while((x<<1)<=tot){
            int t=x<<1|1;
            if(t>tot)t=x<<1;
            if(A[x<<1]<A[t])t=(x<<1);
            if(A[t]<A[x])swap(A[x],A[t]),x=t;
            else break;
        }
    }
    int main(){
        int n,x;
        Rd(n);
        for(int i=1;i<=n;i++){
            Rd(x);
            A[++tot]=x;
            Up(tot);
        }
        for(int i=1;i<=n;i++){
            Pf(A[1]);
            swap(A[1],A[tot--]);
            Down(1);
        }
        return 0;
    }
  10. Sort(C++STL)。(自带光环)速度奇快。

    Rd(n);
    for(int i=1;i<=n;i++)Rd(A[i]);
    sort(A+1,A+n+1);
    for(int i=1;i<=n;i++)Pf(A[i]);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值