非基于比较的排序:桶排序

我们最常用的快速排序和堆排序等算法需要对序列中的数据进行比较,因为被称为基于比较的排序。
而非基于比较的排序有计数排序,桶排序,和在此基础上的基数排序。要注意的是,非基于比较的排序算法的使用都是有条件限制的,例如元素的大小限制。

假设待排序数据是一个随机过程产生,该过程将元素一致地分布在某区间上。

桶排序的思想就是把区间划分成n个相同大小的子区间,或称桶,然后将输入数分布到各个桶中去。因为输入数均匀分布,所以一般不会有很多数落在一个桶中的情况。为得到结果,先对各个桶中的数进行排序,然后按次序把各桶中的元素列出来即可。

举个例子:一年的全国高考考生人数为500万,分数使用标准分,最低100,最高900,没有小数,你把这500万元素的数组排个序。一共可出现的分数可能有多少种呢?一共有900-100+1=801,创建801个“桶”,从头到尾遍历一次数组,对不同的分数给不同的“桶”加料.

比如有个考生考了500分,那么就给500分的那个桶(下标为500-100)加1,完成后遍历一下这个桶数组,按照桶值,填充原数组,100分的有1000人,于是从0填到999,都填1000,101分的有1200人,于是从1000到2119,都填入101.于是经过这次遍历之后所有记录都是有序的了。

public static void bucketSort(int[] keys,int max){
int[] temp=new int[keys.length];//创建临时数组
int[] count=new int[max];//创建桶
//进桶,如果有重复的,那桶里的值为重复的次数
for(int i=0;i<keys.length;i++){
count[keys[i]]++;
}
// 计算“落入”各桶内的元素在有序序列中的位置

for(int i=1;i<max;i++){
count[i]=count[i]+count[i-1];
}
//复制数组
System.arraycopy(keys, 0, temp, 0, keys.length);
// 根据count数组中的信息将待排序列的各元素放入相应位置

for(int k=keys.length-1;k>=0;k--){
keys[--count[temp[k]]]=temp[k];
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值