Java排序算法8:桶排序

来源:互联网 发布:博雅软件新三板 编辑:程序博客网 时间:2024/05/22 17:12

一.思想:

前提: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