桶式排序,也叫计数排序,就是为每个元素创建一个编号为该元素值的桶,将相同元素的个数写入该桶中,然后根据buckets[i]=buckets[i]+buckets[i-1]计算该元素在排序后数组中的位置,最后将原数组元素根据计算出的数组位置放入原数组。
形象展示
步骤:
- 复制arr[n]到temp[n];
- 创建桶式数组buckets[max-min],并全部初始化为0;
- 遍历arr[n],出现元素i,就将buckets[i]的值加1;
- 利用buckets[i]=buckets[i]+buckets[i-1]计算元素在排序后数组中的位置;
- 结合temp[n]和第4步的结果,将元素放入原数组。
- 待排序的元素需在可枚举范围内;
- 内存开销较大;
- 快速简单的排序方法。
public class BucketSort {
/**
* <p>MethodName:main </p>
* <p>Description: 常用排序算法之桶式排序</p>
* <p>@param args</p>
* <p>Return:void </p>
* @author Sunny
* @date 2016-9-27下午3:13:15
*/
public static void main(String[] args) {
int[] arr={7,6,4,9,1,5,2,8,3,1};
bucketSort(arr,0,10);
ArrayUtils.printArray(arr);
}
public static void bucketSort(int[] arr,int min,int max){
//缓存数组
int[] temp=new int[arr.length];
for(int i=0;i<arr.length;i++){
temp[i]=arr[i];
}
//构建max-min个桶,每个桶初始化为0
int[] buckets=new int[max-min];
for(int i=0;i<buckets.length;i++){
buckets[i]=0;
}
//桶中记录 每个元素出现的次数
for(int i=0;i<arr.length;i++){
buckets[arr[i]]++;
}
ArrayUtils.printArray(buckets);
//计算元素在排序后数组中的位置
for(int i=1;i<buckets.length;i++){
buckets[i]=buckets[i]+buckets[i-1];
}
ArrayUtils.printArray(buckets);
//将各元素按计算出的位置存入原数组
for(int i=0;i<arr.length;i++){
arr[--buckets[temp[i]-min]]=temp[i];
}
}
}
结果展示:
0 2 1 1 1 1 1 1 1 1
0 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 6 7 8 9