快速排序【模板】

标题:小哼买书
标签:字符串模拟排序字符串处理
详情:小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读哪些书。小哼让每个同学写出一个自己最想读的书的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",n-cnt);
    for(int i=1;i<n;i++){
        if(a[i]!=a[i+1]) printf("%d ",a[i]);
    }
    printf("%d\n",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",n-cnt);
    for(int i=1;i<n;i++){
        if(a[i]!=a[i+1]) printf("%d ",a[i]);
    }
    printf("%d\n",a[n]);
    return 0;
}


posted @ 2018-05-08 11:53  神探小小狄  阅读(124)  评论(0编辑  收藏  举报
【推荐】 程序员网址大全  |  EF CodeFirst  |  百度地图.NET  |  MyNPOI  |  开源  |  我的皮肤  |  ASP.NET MVC4  |  前端提升   |  LINQ   |  WCF   |  EasyUI  | aaronyang 页脚html代码