排序算法----桶排序

1. 桶排序:桶排序是基数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序( 有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排 )

2. 桶排序的时间,空间复杂度及稳定性:

        1>. 时间复杂度:O(n+m) 。

        2>. 空间复杂度:O(n+m)。

        3>. 稳定性:稳定。

3. 桶排序的实现:

//桶排序
/*
 * 我们将数组中的数据分成多个桶 每个桶中可以存放不同范围的数据 
 * 并且桶存放的数据范围是依次递增的
 * 将数组中的数据分别进桶
 * 对每个桶中的数据进行排序 可以使用其他排序方法 也以再使用桶排序
 * 再将每个桶中排序好的数据依次放入原数组中
 * 桶的个数 以及 要将数据分入的桶的编号 都可以通过数组中的最大值 和 最小值来进行计算
 */
public class BucketSort {
	public static void main(String[] args) {
		int[] arr = {233, 53, 10, 7, 4, 69, 433, 53, 18, 100};
		bucketSort(arr);
		System.out.println(Arrays.toString(arr));
	}

	//对数组进行桶排序
	private static void bucketSort(int[] arr) {
		//1.获取数组中的最大值 和 最小值
		int max = arr[0];
		int min = arr[0];
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] > max) {
				max = arr[i];
			}else if(arr[i] < min) {
				min = arr[i];
			}
		}
		//2.获取桶的个数
		int bucketNum = (max - min) / arr.length + 1;
		//3.将每个桶创建出来 这里用ArrayList对象表示桶
		LinkedList<Integer>[] list = new LinkedList[bucketNum];
		for(int i = 0; i < list.length; i++) {
			list[i] = new LinkedList<Integer>();
		}
		//4.将数组的数据分入对应索引的桶中 
		for(int i = 0; i < arr.length; i++) {
			list[(arr[i] - min) / arr.length].add(arr[i]); //将原数组中的数据添加到指定编号的桶中
		}
		//5.对每个桶中的数据进行排序
		for(int i = 0; i < list.length; i++) {
			list[i].sort(new Comparator<Integer>() {

				@Override
				public int compare(Integer o1, Integer o2) {
					return o1 - o2;
				}
			});
		}
		//6.将每个桶中的数据依次放回原数组
		int index = 0;
		for(int i = 0; i < list.length; i++) {
			for(int j = 0; j < list[i].size(); j++) {
				arr[index++] = list[i].get(j);
			}
		}
	}
}

4. 运行结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值