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

本文介绍了桶排序的基本原理,包括其适用条件与场景,并通过一个示例程序展示了桶排序的具体实现过程。文章还讨论了桶排序的时间复杂度及空间复杂度。

桶排序:

一、条件

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

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
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值