这两天在看排序,以前也没听说过桶式排序,看了书上的介绍,然后自己理解了一遍,发觉这个排序视乎是十个排序里面最不好的一个,在李刚的那本书上是这么介绍的,
桶式排序将要排序的所有值处于一个可枚举的范围内,这个范围不能够太过于大,否则开销大,怎么说呢,这个排序不适合与排序序列差别比较大的比如说10000跟1,这个开销就大了很多,下面是书上的一个例子,我觉得写得挺清楚的,我就不多解释,可以看看图
大概的一个过程就如图所示,其实乍一看之下,这个排序其实没有任何意义,很多时候还很恶心。但其实不是,这个算法跟一个经典算法可以进行组合。先卖个关子,先看看桶式排序的代码吧
package com.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Created by wk on 2014/7/1.
*/
public class BucketSort {
public static int[] bucketSort(int sorts[], int min, int max) {
int arrayLength = sorts.length;
int tmp[] = new int[arrayLength];
//定义max-min个桶
int buckets[] = new int[max - min];
//计算每个元素在序列中出现的次数
for (int i = 0; i < arrayLength; i++) {
buckets[sorts[i] - min]++;
}
for (int i = 1; i < max - min; i++) {
buckets[i] = buckets[i] + buckets[i - 1];
}
//循环结束后buckets数组元素的值代表了落入当前桶中的元素所在有序序列中的位置
System.arraycopy(sorts, 0, tmp, 0, arrayLength);
for (int k = arrayLength - 1; k >= 0; k--) {
sorts[--buckets[tmp[k] - min]] = tmp[k];
}
return sorts;
} //桶式排序
public static void main(String args[]) {
int[] older_arr = {3, 2, 1, 4, 5};
System.out.println("未排序:");
display(older_arr);
int[] new_arr = bucketSort(older_arr, 1, 6);
System.out.println("排序后:");
display(new_arr);
}
public static void display(int[] arrays) {
for (Integer i : arrays)
System.out.print(i + ",");
}
//获取不重复随机数
public static int[] getArray(int n) {
List<Integer> list = new ArrayList<Integer>();
int[] ins = new int[n];
for (int i = 0; i < n; i++) {
int number = new Random().nextInt(1000);
if (!list.contains(number)) {
list.add(number);
ins[i] = number;
}
}
return ins;
}
}