9.排序算法-桶排序

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:

在额外空间充足的情况下,尽量增大桶的数量
使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中,数据范围在桶范围内。
同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。

1. 什么时候最快
    当输入的数据可以均匀的分配到每一个桶中。

2. 什么时候最慢
    当输入的数据被分配到了同一个桶中。

3.桶排序思想

让全量的排序变成局部的排序,降低比较次数

4. 示意图
元素分布在桶中:

标题

然后,元素在每个桶中排序:

标题

代码实现

package com.xg;

import java.util.Arrays;

public class BucketSort {

	public static void main(String[] args) {
		
		int[] array = {1,1,1,1,1,1,1,1,0,1,2,3,5,4,9,7,8,6,10};
		
		//bucketSort(array);
		
		//1、找最大值
		int maxNum = Integer.MIN_VALUE;
		for(int i=0;i<array.length;i++) {
			if(array[i]>maxNum) {
				maxNum = array[i];
			}
		}
		
		//2、创建桶(范围是 max+1,应为数组从0开始)
		int[] bucketArray = new int[maxNum+1];
		
		//3、数据和桶编号做映射,如果映射关系成立,给桶标记
		for(int i=0;i<array.length;i++) {
			int num = array[i];
			//4、如果有桶映射有数据给桶编号+1标志,相同的数累加1
			bucketArray[num]=bucketArray[num]+1;
		}
		
		
		//5、遍历桶
        int n = 0;
		for (int i=0;i<bucketArray.length;i++) {
			//每个桶有bucketNum个数
			int bucketNum = bucketArray[i];
			//标记一个桶有多少个元素
			for(int k = 0 ;k<bucketNum;k++) {
				//array的第n个元素=第N个桶,桶内元素第n个
				array[n++] = i;
			}
		}
		
		
		System.out.println(Arrays.toString(array));

	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值