引例:
经过了在山东农业大学一学期的学习,我们迎来了耿霞老师开设C++程序设计课程的期末考试,在程序设计题的第一题给我们出了一道这样的题:
((✺ω✺))给你一组数据(1<n<1000),数据中可能有重复,你的任务是完成去重,并按照从小到大顺序输出数据。(NOIP2006)
考试的时候拿到这个题有两个思路:1.先去重再排序输出 2. 先排序再去重输出(重复的都在一起)
对于第一种思路,我们可以假设有很多桶,然后我们挨着枚举数据,把数据扔进带有编号的桶中,标记该桶,枚举完成后将带有标记的桶的编号进行输出。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000;
int main()
{
bool flag[MAXN+1];
//因为数组下标是少1的,我们多加一个元素表示maxn
memset(flag,0,sizeof(flag));
//初始化该桶
int n=0,temp=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>temp;
flag[temp]=true;
//标记该桶
}
for(int i=1;i<=1000;i++)
if(flag[i])
cout<<i<<' ';
return 0;
}
对于第二种思路:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int shuzu[101];
memset(shuzu,0,sizeof(shuzu));
int n=0;
cin>>n;
for(int i=0;i<n;i++)
cin>>shuzu[i];
sort(shuzu,shuzu+n);
cout<<shuzu[0]<<' ';
for(int i=1;i<n;i++)
{
if(shuzu[i]!=shuzu[i-1])//不重复就输出
cout<<shuzu[i]<<' ';
}
return 0;
}
由第一种方法的代码稍加修改可以引出今天学习的第一种排序:简化版的桶排序
#includ