排序算法Java实现——桶排序

来源:互联网 发布:网格布定额算法 编辑:程序博客网 时间:2024/06/08 03:43

桶排序:

一、条件

桶排序不在是一种基于比较的排序方法,而是需要待排序列满足以下两个条件:

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),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。此外,桶排序是稳定的。

1 0
原创粉丝点击