桶排序的局限性:
1:只能对非负整数进行操作
2:排序后的数据不会出现重复(与其说是缺点,不如说是其优点)
前段时间携程春招客户端研发工程师有这样一道编程题
输入一组整数,请找出这组整数中只出现一次且在这组数中首次出现的数,并打印该元素的值(要求算法的复杂度为n,n为该组整数的总数)?
输入描述:
1,1,2,2,3,3,8,4,5,5,5,6,6,7,7,1,1,9,9,4,4,10,11,12,12
有位朋友用了桶排序的方法,机智的给出了该题目结果
代码如下:
#include <iostream>
using namespace std;
int main() {
char c;
int a[1000];
int ms[10000];
memset(ms, 0, 10000*sizeof(int)); //把ms的每个值初始化为0
int n = 0;
int maxn = 0;
while(true)
{
cin >> a[n];
if(a[n] > maxn)
{
maxn = a[n]; //获取输入最大的值
}
ms[a[n]]++; //ms[a[n]] = ms[a[n]] +1 ;
n++;
c = getchar();
if(c != ',')
{
break;
}
}
for(int i=0; i<=maxn; i++)
{
if(ms[i] == 1)
{
cout<<i<<endl;
break;
}
}
return 0;
}
代码运行结果如下:
奇怪的是,该题目竟然AC成功了,我不得不怀疑携程出题人的数学水平了(纯属开玩笑哈),下面进入正题
题目要求的是输入的是整数,整数有正整数、负整数、0 ,当我们输入负整数的时候,改代码就不会得出正确的结果,肯定GG
原因何在?
处在这一句代码上:ms[a[n]]++ ;
加入我输入的是一个负整数,那么ms[负整数] ,数组的下标不可能为负。所以这句是桶排序的局限性
下面在我用java代码写的桶排序算法:
import java.util.Scanner;
public class BucketSort_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//scanner.hasNext():输入为int 数据时返回true ,输入其他数据时返回false
while(scanner.hasNext()){
int n = scanner.nextInt();
int[] arrays = new int[1000];
for(int i = 0; i < n; i++)
{
arrays[i] = scanner.nextInt();
}
//使用桶排序
boolean[] boolean_arrays = new boolean[1000] ;
for(int i=0;i<n;i++){
boolean_arrays[arrays[i]]= true ;
}
//输出数据
for(int i=0;i<1000;i++)
{
if(boolean_arrays[i] == true)
System.out.println(i);
}
}
}
}
排序的结果是:
排序后的数组中不会有重复的元素(这一点是不是和Hash Set 中元素不可重复性很相似),有兴趣的读者自己去研究Hash Set吧。