桶排序
介绍
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:
- 在额外空间充足的情况下,尽量增大桶的数量
- 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中
同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
步骤
- 找出待排序数组的最大值和最小值;
- 跟据数组的最大值和最小值的差值以及桶的大小确定桶的数量;
- 将数组中的每个元素分配到桶中;
- 从桶中取出有序元素;
演示
推荐排序算法动态调试、演示网站: https://www.cs.usfca.edu/~galles/visualization/BucketSort.html
图片来源于:https://www.runoob.com/w3cnote/bucket-sort.html
元素分布在桶中:
然后,元素在每个桶中排序:
代码与思想
public class BucketSort {
public static void main(String[] args) {
int[] nums = new int[]{711,42,333,6,7555,85,93,24,30,177};
bucketSort(nums,3);
System.out.println(Arrays.toString(nums));
}
public static void bucketSort(int[] nums,int bucketSize){
int min = nums[0];
int max = min;
for(int i=0;i<nums.length;i++){
if(min>nums[i]) min = nums[i];
if(max<nums[i]) max = nums[i];
}
int bucketCount = (max - min) / bucketSize + 1;
int[][] buckets = new int[bucketCount][0];
for (int i = 0; i < nums.length; i++) {
int index = (nums[i] - min) / bucketSize;
buckets[index] = arrayAppend(buckets[index], nums[i]);
}
for(int i=0;i<buckets.length;i++){
if (buckets[i].length==0) continue;
CountSort.countSort(buckets[i]);
}
int index = 0;
for (int[] bucket : buckets) {
for (int i : bucket) {
nums[index++] = i;
}
}
}
public static int[] arrayAppend(int[] nums,int num){
int[] newNums = Arrays.copyOf(nums,nums.length+1);
newNums[newNums.length-1] = num;
return newNums;
}
}
|