• [模板][快速排序&归并排序]


    不得不说,手写的快排真的好菜。(即使开了随机数...)


    快速排序

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    inline int read();
    const int Maxn = 100010 ;
    namespace iNx{
        int n;
        int q[Maxn];
        void exchange(int a,int b){
            int t=q[a];
            q[a]=q[b];
            q[b]=t;
        }
        void quicksort(int left,int right){
            if(left>=right) return ;
            exchange(left,(rand()%(right-left+1))+left);
            int key=q[left],i=left,j=right;
            while(i<j){
                while(q[j]>=key&&i<j) j--;
                if(j>i) q[i++]=q[j];
                while(q[i]<=key&&i<j) i++;
                if(i<j) q[j--]=q[i];
            }
            q[i]=key;
            quicksort(left,i-1);
            quicksort(i+1,right);
        }
        int main(){
            n=read();
            int i;
            for(i=1;i<=n;i++) q[i]=read();
            quicksort(1,n);
            for(i=1;i<=n;i++) printf("%d ",q[i]);
            puts("");
            return 0;
        }
    }
    int main(){
        iNx::main();
        return 0;
    }
    inline int read(){
        int kk=0,ff=1;
        char c=getchar();
        while(c<'0'||c>'9'){
            if(c=='-') ff=-1;
            c=getchar();
        }
        while(c>='0'&&c<='9') kk=kk*10+c-'0',c=getchar();
        return kk*ff;
    }

    归并排序

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    inline int read();
    
    const int Maxn = 100010 ;
    namespace iNx{
        int n,q[Maxn],t[Maxn];
        void mergesort(int left,int right){
            if(left>=right) return ;
            int mid=(left+right)>>1;
            mergesort(left,mid);
            mergesort(mid+1,right);
            int i=left,j=mid+1,k=left;
            while(i<=mid&&j<=right){
                if(q[i]<=q[j]) t[k++]=q[i++];
                else t[k++]=q[j++];
            }
            while(i<=mid) t[k++]=q[i++];
            while(j<=right) t[k++]=q[j++];
            for(i=left;i<=right;i++) q[i]=t[i];
        }
        int main(){
            n=read();
            int i;
            for(i=1;i<=n;i++) q[i]=read();
            mergesort(1,n);
            for(i=1;i<=n;i++) printf("%d ",q[i]);
            puts("");
        }
    }
    int main(){
        iNx::main();
        return 0;
    }
    inline int read(){
        int kk=0,ff=1;
        char c=getchar();
        while(c<'0'||c>'9'){
            if(c=='-') ff=-1;
            c=getchar();
        }
        while(c>='0'&&c<='9') kk=kk*10+c-'0',c=getchar();
        return kk*ff;
    }

    可以到洛谷上测试:P1177 【模板】快速排序

    附上两种代码测评结果(此题时间限制3s):

    快速排序:

    归并排序:

    (天天进步一点点hhh。)

  • 相关阅读:
    git merge merge错误 —— 纠正
    copy —— docker cp & kubectl cp
    docker —— 获取 仓库中的 tag 列表
    课程——《深度学习的优化方法》
    基础知识篇(干货,次次都有新体悟)——十大经典排序算法2
    基础知识篇(干货,次次都有新体悟)——数据结构
    criteo 接口升级——MAPI deprecated
    CAP
    Redis 数据类型
    十大经典排序算法(转发)
  • 原文地址:https://www.cnblogs.com/_inx/p/11480954.html
Copyright © 2020-2023  润新知