引入:
桶排序是基于计数排序的一种排序算法,通过将待排序元素分配到不同的桶中,并对每个桶内的元素进行排序,最后按顺序将各个桶中的元素合并起来得到有序序列。
代码实现
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int b[100005]; // 100005个桶
int main()
{
memset(b,0,sizeof(b)); // 初始化桶,起初所有桶中都没有元素
int n;
cin>>n;//输入数据的个数
int x;//存放要输入的数据
for(int i=0;i<n;i++)
{
cin>>x;
b[x]++;
}
int k = 0;//记录已经排好的元素个数
for(int i=0;i<100005;i++)//遍历所有桶
for(int j=0;j<b[i];j++) // 遍历桶中的元素
a[k++] = i;//按顺序存回数组a中
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
使用了一个桶数组 b
来记录每个元素出现的次数。然后遍历所有元素,将其分配到对应的桶中。最后遍历所有桶,将桶中的元素按顺序放入原数组中。使用了 memset
函数来初始化桶,将其全部赋值为0。这里我假设待排序的元素都是非负整数,因此桶的数量和桶的大小都设为了 100005
。
例题:
#include <bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
int main()
{
int t;
cin>>t;
while(t--)
{
int x,p=0;
while(cin>>x)
{
if(x==0)break;
a[++p]=x;
}
memset(b,0,sizeof(b));
for(int i=1;i<=p;i++)//前面用了++p,下标从1开始
{
b[a[i]]++;
}
int ans=0;
for(int i=1;i<=p;i++)
{
if(b[a[i]]>0&&b[2*a[i]]>0)
ans++;
}
cout<<ans<<endl;
}
return 0;
}