Java排序算法8:桶排序

一.思想:

前提:1.待排序序列处于一个可枚举的范围之中。2.可枚举的范围不应该太大,否则开销太大。

首先构建一个Buckets数组,用于记录落入桶内的元素个数,然后,再对Buckets数组进行重新计算,可以得出每个待排序的元素在有序序列中的位置。在这个过程中,需要对每个桶中的若干个元素又进行排序,当然如果这个桶中只有一个元素则不需要。如下面的例子,定义了10个桶,所有每个桶内的元素是一样的,假如定义了2,3个桶,那么则需要在桶内重新排序。

二.例子:

比如5,4,6,6,2,

1.创建长度为num.length的Buckets数组,创建temp数组,把5,4,6,6,2复制到temp数组中。

2.记录落入每个桶中的元素个数,利用Buckets[num[i]]++。比如num[0]=5,那么buckets[5]=1,说明在5号桶中有一个元素,数值为5。再比如num[3]=6,num[4]=6,则buckets[6]=2,说明落入6号桶中的元素有2个,数值为6.其他以此类推。那么最后结果为buckets[2]=1,buckets[4]=1,buckets[5]=1,buckets[6]=2

3.计算每个元素在有序序列中的位置。通过buckets[i]=bucket[i]+buckets[i-1];比如bucket[2],因为buckets[0]和buckets[1]都没有东西,所以说buckets[2]还是等于1,也就是说在有序序列中的第1位,对于buckets[4],buckets[4]=buckets[4]+buckets[3],那么buckets[3]又等于buckets[2],其实就相当于算bucket[4]前面有多少个元素,那么buckets[4]前面只有buckets[2]这一个元素,所以buckets[4]=2,也就是说buckets[4]排在第2位,其他依次类推。

4.知道了每个元素排在多少位,再利用num[--buckets[temp[j]]] = temp[j];把temp数组的元素依次重新放入num数组中,最后就可以完成排序。对于num[--buckets[temp[j]]] = temp[j];最好是拿纸拿笔写出来一步一步理解。

三.实现代码:

public class BucketsSort {
	public static void main(String args[])
	{
		int num[] = {4,3,6,9,5,3,2,3,1};

		System.out.print("原始数据:");
		print(num);		
		
		Bucketsort(num,0,10);
		
		System.out.print("排序后数据:");
		print(num);
	}
	public static void Bucketsort(int num[],int min,int max)
	{
		int i,j;
		
		int temp[] = new int[max - min];
		int buckets[] = new int[max - min];
		
		//记录每个元素在序列中出现的次数
		for(i = 0; i < num.length; ++i)
		{
			buckets[num[i]]++;
		}
		
		//计算“落入”桶内的元素在有序序列中的位置
		for(i = 1; i < max; ++i)
		{
			buckets[i] = buckets[i] + buckets[i - 1];
		}
		
		//将num[]中的数据完全复制到temp[]数组
		System.arraycopy(num, 0, temp, 0, num.length);
		
		//根据buckets数组中的信息将待排序列的各元素放入相应的位置
		for(j = num.length - 1; j >= 0; --j)
		{
			num[--buckets[temp[j]]] = temp[j];
		}
	}
	
	public static void print(int num[])
	{
		int i;
		
		for(i = 0; i < num.length; ++i)
		{
			System.out.print(num[i]+" ");
		}
		System.out.print("\n");
	}
}

四.复杂度和应用:

时间复杂度为:O(n+k)  k表示排序数据的范围   空间复杂度为::取决于n(需要创建temp数组)和k(桶的大小)

应用:适用于元素范围不大的情况,也适用于海量计算,比如说高考500万考生,需要考试成绩排序,那么成绩0--750分,就可以定义750个桶。

五.参考资料:

1.追竹的博客:http://blog.csdn.net/apei830/article/details/6596057

2.百度百科-桶排序:http://baike.baidu.com/view/1784217.htm?fr=wordsearch

六:相关排序代码下载:
包含(冒泡排序,桶排序,堆排序,插入排序,归并排序,快速排序,基数排序,选择排序,希尔排序)
免积分下载地址: http://download.csdn.net/detail/u014077165/7185895
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值