zoukankan      html  css  js  c++  java
  • [模板][快速排序&归并排序]

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


    快速排序

    #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。)

  • 相关阅读:
    第十章:Android消息机制
    第九章:四大组件的工作过程
    第八章:理解Window和WindowManager
    第七章:Android动画深入分析
    第六章:Android的Drawable
    第五章:理解RemoteViews
    第四章:View的工作原理
    第三章:View的事件体系
    chr()返回值是当前整数对应的 ASCII 字符。
    遍历从左到右,打印子串在字符串中出现的次数
  • 原文地址:https://www.cnblogs.com/_inx/p/11480954.html
Copyright © 2011-2022 走看看