局限的桶排序与Hash中Set的微妙相似关系

桶排序的局限性:

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吧。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值