java实现桶排序(详细解析)

什么是桶排序

桶排序 (Bucketsort),是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,他不受到 O(n log n) 下限的影响。

桶排序思想

桶排序的思想是,若待排序的记录的关键字在一个明显有限范围内时,可设计有限个有序桶,每个桶只能装与之对应的值,顺序输出各桶的值,将得到有序的序列。简单来说,在我们可以确定需要排列的数组的范围时,可以生成该数值范围内有限个桶去对应数组中的数,然后我们将扫描的数值放入匹配的桶里的行为,可以看作是分类,在分类完成后,我们需要依次按照桶的顺序输出桶内存放的数值,这样就完成了桶排序。

举例

例如,要求我们输入 n 个 0~9 之间的整数,由小到大排序输出,我们可以准备 10 个桶依次编号为 0~9。那么,输入的数 0 则入 0 号桶,1 入 1 号桶,依次类推。

java实现桶排序(详细解析)_第1张图片

如上图琐事,我们已准备好 10 个空桶并编号。

下面我们依次输入 8 个整数,分别是 2,5,6,8,5,2,9,6,我们每输入一个数值就将其放入对应的桶。

输入完毕后桶内数据如图所示:

java实现桶排序(详细解析)_第2张图片

实现步骤

  1. 遍历原始数组,找到数组中的最大值
  2. 创建一个下标为原始数组中最大值的桶数组,该桶数组的下标代表元素,该数组下标所对应的值代表这个值出现的次数
  3. 再次遍历原始数组,得到原数组中存在的各个元素,以及出现的次数
  4. 遍历桶数组,外层循环从桶的第一位开始(即下表为零);内层循环遍历桶数组中下标为i的值出现的次数

代码描述


import java.util.Arrays;

public class bucketSortTest {
	public static void bucketSort(int[] num) {

		// 遍历原始数组,找到数组中的最大值
		int max = num[0];
		for (int i = 0; i < num.length; i++) {
			if (num[i] > max) {
				max = num[i];
			}
		}

		// 创建一个下标为原始数组中最大值的桶数组,该桶数组的下标代表元素,该数组下标所对应的值代表这个值出现的次数
		
		int[] bucketArray = new int[max + 1];

		// 再次遍历原始数组,得到原数组中存在的各个元素,以及出现的次数
		for (int i = 0; i < num.length; i++) {
			bucketArray[num[i]]++;
		}

		// 遍历桶数组,外层循环从桶的第一位开始(即下表为零);内层循环遍历桶数组中下标为i的值出现的次数
		int index = 0;
		for (int i = 0; i < bucketArray.length; i++) {
			for (int j = 0; j < bucketArray[i]; j++) {
				num[index++] = i;
			}
		}
	}

	public static void main(String[] args) {
			int[] num=new int[] { 2,5,6,8,5,2,9,6};
			bucketSort(num);
			System.out.println(Arrays.toString(num));
			  
	}
}

运行结果
java实现桶排序(详细解析)_第3张图片
练习
小伙伴们可以通过下面这篇文章练习,进而更进一步掌握桶排序。
LeetCode451. 根据字符出现频率排序(含详细Java解析)采用桶排序

你可能感兴趣的:(Java学习,桶排序,java,排序算法)