桶排序(简易版)

定义:桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θn))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。

(以上内容来自百度百科)

这里举个例子来体会一下桶排序:

比如一年高考考生人数为800万,分数使用标准分,最低100,最高900,没有小数,对这800万元素的数组进行排序。

分析:对800万数据排序,如果使用合并排序、快速排序等时间复杂度还算不错(O(nlogn))的排序算法,平均比较次数为8000000log8000000≈5522万。但我们发现这些数据都有一个条件:100<=score<=900,那么我们就可以考虑桶排序,让其在毫秒级别完成这800万数据的排序。

方法:创建一个大小为800的桶(我这里为了方便直接创建1000个桶,也就是大小为1000的一个一维数组score[])。

将数组score[0]~score[1000]初始化为0,实际上每一个桶相当于一个分数,score[210]=0表示目前还没有人得210分,score[511]=0表示目前还没有人得511分...如果有一个人得了540分,那么将这个分数放入540这个桶当中score[540]=1,如果有7个人得了631分,则score[631]=7。

遍历这个数组打印,如果score[xxx]=0,则不打印,score[631]=7,则打印7个631,以10分数为例子,代码如下:

static void Bucketsort() {
		int a[] = new int[1000];//1000个桶
		//a[0]为0,表示“0”没有出现过
		//a[1]为0,表示“1”没有出现过
		//。。。。
		int n,x;
		Scanner sc=new Scanner(System.in);
		for(int i=0;i<a.length;i++)a[i]=0;//初始化为0
		x=sc.nextInt();
		for(int i=0;i<x;i++){//随机读入x个数
			n=sc.nextInt();
			a[n]++;//计数
		}
                for(int i=0;i<a.length;i++){//从小到大排序
			for(int j=1;j<=a[i];j++){//a[i]等于几就输出几次
				System.out.print(i+"-");
			}
		}
		System.out.print("\n");
		for(int i=a.length-1;i>0;i--){//从大到小排序
			for(int j=1;j<=a[i];j++){
				System.out.print(i+" ");
			}
		}

运行结果如下:


思考:桶排序的时间复杂度为O(n+x)  ,n为桶的个数,x为待排序的数。实际上,桶排序是一种以空间换时间的算法,分配的桶越多,时间越快,浪费的空间也许会越多,若元素集合为1到1亿,那么分配1亿个桶显然是不现实的。所以桶排序适合元素集合不大的情况,比如对身高排序、分数排序等等。

扫描二维码关注公众号,回复: 1093843 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_37094660/article/details/79725113