桶排序:
一、条件
桶排序不在是一种基于比较的排序方法,而是需要待排序列满足以下两个条件:
1)待排序列的值处于一个可枚举的范围内
2)待排序列所在可枚举范围不应太大,不然开销会很大。
二、场景
桶排序(Bucket Sort)的原理很简单,它是将数组分到有限数量的桶子里。
假设待排序的数组a中共有N个整数,并且已知数组a中数据的范围[0, MAX)。在桶排序时,创建容量为MAX的桶数组r,并将桶数组元素都初始化为0;将容量为MAX的桶数组中的每一个单元都看作一个"桶"。
在排序时,逐个遍历数组a,将数组a的值,作为"桶数组r"的下标。当a中数据被读取时,就将桶的值加1。例如,读取到数组a[3]=5,则将r[5]的值+1。
三、代码
/*@(#)bucketSort.java 2017-4-27
* Copy Right 2017 Bank of Communications Co.Ltd.
* All Copyright Reserved
*/
package com.sort.cn;
/**
* TODO Document bucketSort
* <p>
* @version 1.0.0,2017-4-27
* @author Singit
* @since 1.0.0
*/
public class bucketSort {
public static void main(String[] args) {
int[] x = { 98, 65, 25, 44, 50, 20 ,110, 50};
int[] sorted = bucketSort(x, 9999);
for (int i = 0; i < sorted.length; i++)
{
if (sorted[i] > 0)
System.out.print(sorted[i]+" ");
}
}
public static int[] bucketSort(int[] nums, int maxNum){
int[] sorted = new int[maxNum+1];
for(int i=0; i<nums.length; i++){
sorted[nums[i]] = nums[i];//把数据放到对应索引的位置
}
return sorted;
}
}
输出结果:
20 25 44 50 65 98 110
总结:
桶排序的平均时间复杂度为线性的O(N+C),其中C=N*(logN-logM)。
如果相对于同样的N,桶数量M越大,其效率越高,最好的时间复杂度达到O(N)。
当然桶排序的空间复杂度 为O(N+M),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。此外,桶排序是稳定的。