• 快速排序【模板】


    标题:小哼买书
    标签:字符串模拟排序字符串处理
    详情:小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读哪些书。小哼让每个同学写出一个自己最想读的书的ISBN号(你知道吗?每本书都有唯一的ISBN号,不信话你去找本书翻到背面看看)。当然有一些好书会有很多同学都喜欢,这样就会收集到很多重复的ISBN号。小哼需要去掉其中重复的ISBN号,即每个ISBN号只保留一个,也就说同样的书只买一本(学校真是够抠门的)。然后再把这些ISBN号从小到大排序,小哼将按照排序好的ISBN号去书店去买书。请你协助小哼完成“去重”与“排序”的工作。
    输入格式:
    输入有2行,第1行为一个正整数,表示有n个同学参与调查(n<=100)。第2行有n个用空格隔开的正整数,为每本图书的ISBN号(假设图书的ISBN号在1~1000之间)。
    输出格式:
    输出也是2行,第1行为一个正整数k,表示需要买多少本书。第2行为k个用空格隔开的正整数,为从小到大已排好序的需要购买的图书ISBN号。
    提示:改编自全国青少年信息学奥林匹克联赛(NOIP2006)普及组第一题《明明的随机数》。
    限制:每个测试点1秒
    样例:

    输入

    10
    20 40 32 67 40 20 89 300 400 15

    输出

    8
    15 20 32 40 67 89 300 400

    题解1:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <set>
    #include <map>
    using namespace std;
    void quickSort(int a[],int L,int R){//快速排序-------------------------模板1
        if(L>R) return;
        int i=L,j=R;
        int temp=a[L];//基准数为数组最左边的数
        while(i!=j){
            while(a[j]>=temp&&i<j)//先从右边开始找第一个小于基准数的数
                j--;
            while(a[i]<=temp&&i<j)//再从左往右找第一个大于基准数的数
                i++;
            if(i<j)//如果i和j没有相遇则交换他们
                swap(a[i],a[j]);
        }
        swap(a[L],a[i]);//基准数归位
        quickSort(a,L,i-1);//递归处理左边
        quickSort(a,i+1,R);//递归处理右边
    }
    int main()
    {
        int n,a[105];
        scanf("%d",&n);
        int cnt=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        quickSort(a,1,n);
        for(int i=1;i<n;i++){
            if(a[i]==a[i+1]) cnt++;
        }
        printf("%d
    ",n-cnt);
        for(int i=1;i<n;i++){
            if(a[i]!=a[i+1]) printf("%d ",a[i]);
        }
        printf("%d
    ",a[n]);
        return 0;
    }
    

    题解2:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <set>
    #include <map>
    using namespace std;
    const int maxn=105;
    int Partition(int a[],int L,int R){//以a[R]作为划分值
        int less=L-1;//小于划分值的区域
        int more=R;//大于划分值的区域
        while(L<more){
            if(a[L]<a[R]){//从左往右如果找到小于划分值的数,找到之后小于区长度+1,L指针往后移一位
                swap(a[++less],a[L++]);
            }else if(a[L]>a[R]){//从左往右如果找到大于划分值的数,找到之后大于区长度+1,L指针不动
                swap(a[L],a[--more]);
            }else L++;//相同不作处理
        }
        swap(a[more],a[R]);
        return L;
    }
    void quickSort(int a[],int L,int R){//快速排序---------------------------------------模板2
        
        int p=Partition(a,L,R);//取得划分值的位置
        if(L<R){
            quickSort(a,L,p-1);//递归处理左边
            quickSort(a,p+1,R);//递归处理右边
        }
    }
    int main()
    {
        int a[maxn],n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        quickSort(a,1,n);
        int cnt=0;
        for(int i=1;i<n;i++){
            if(a[i]==a[i+1]) cnt++;
        }
        printf("%d
    ",n-cnt);
        for(int i=1;i<n;i++){
            if(a[i]!=a[i+1]) printf("%d ",a[i]);
        }
        printf("%d
    ",a[n]);
        return 0;
    }
    


  • 相关阅读:
    io工具类
    并发高级知识
    HashMap相关源码阅读
    ArrayList和LinkedList部分源码分析性能差异
    我自己的JdbcTemplate
    mysql5.7.20靠谱安装步骤
    NG 转发配置
    SQLite总结
    算是不常用的东西,java中的ResultSet转List
    不常用的技能-【手动编译java类】
  • 原文地址:https://www.cnblogs.com/kzbin/p/9205243.html
Copyright © 2020-2023  润新知