桶排序

原创 2018年04月16日 20:21:07

桶排序的原理和计数排序类似,可以说是计数排序的升级版。他利用了函数映射关系,将输入的值映射到对应的桶里面去。

所以他的高效就在于这个映射函数的确定。所以需要做到如下两点:

1.在额外空间充足的情况下,尽量增大桶的数量。

2.使用映射函数能将输入的N个数据均匀的分配到K个桶中去。

此外就是对于桶中的数据元素的排序时,使用哪种比较排序的算法比较好,对性能的影响至关重要。

什么时候最快:

当输入数据可以均匀分配到每一个桶中去.

什么时候最慢:

当输入数据分配到一个桶中去.

分析过程(图片部分制作粗糙,请见谅):

根据最大值最小值分配的给这个桶切块。切成的块是23然后通过每个数字去计算这个放到那个模块中。我这里只展示这几个数据的各部分。我们将桶的size设置为了5,也就是说每个桶只能放入5个数据元素。

也可以理解为将根据间隔为5,用数轴依次展开,就可以直到这个数大致位于哪里了。

(这里没有对倒数第二个桶进行内部排序)


参考代码:

使用的是插入排序。

public class BucketSort {

	public static void main(String[] args) {
		int [] a = {121, 39, 56, 20, 9, 7, 16};
		System.out.println(Arrays.toString(bucketSort(a, 5)));
	}

	private static int[] bucketSort(int[] arr, int bucketSize) {

		//arr复制
		int[] a = Arrays.copyOf(arr, arr.length);
		//寻找最大值和最小值
		int max = a[0];
		int min = a[0];
		for(int i = 0; i < a.length; i ++){
			if(a[i] > max){
				max = a[i];
			}
			else if(a[i] < min){
				min = a[i];
			}
		}
		//math.floor()对浮点数向下取整
		int bucketCount = (int)Math.floor((max - min) / bucketSize) + 1;
		int [][] buckets = new int[bucketCount][0];
		//通过映射函数将各数据映射到桶中去
		for(int i = 0; i < a.length; i ++){
			int index = (int)Math.floor((a[i] - min) / bucketSize);
			buckets[index] = arrApend(buckets[index], a[i]);
		}
		int arrIndex = 0;
		for(int[] bucket : buckets){
			if(bucket.length <= 0){//招那些装了数据的桶
				continue;
			}
			//对每个桶进行排序, 使用插入排序
			bucket = insertSort(bucket);
			for(int value : bucket){
				a[arrIndex ++] = value;
			}
		}
		return a;
	}

	private static int[] arrApend(int[] array, int value) {

		array = Arrays.copyOf(array, array.length + 1);
		array[array.length - 1] = value;
		return array;
	}

	//插入排序  -- 一个标志位  和之前的所有元素比较
	private static int[] insertSort(int [] a){
		int temp = 0;
		int j = 0;
		for(int i = 1; i < a.length; i ++){
			temp = a[i];
			for(j = i; j > 0 && a[j - 1] > temp; j --){
				a[j] = a[j - 1];
			}
			a[j] = temp;
		}
		return a;
	}
}

输出的时候是根据桶的顺序输出数据。

结果截图:




以上就是这篇的内容,如果有什么错误或者可以改进的地方,亦或是你有什么疑惑,欢迎留言。让我们共同进步。谢谢!

【经典算法】:桶排序

桶排序是一种特别逗比的方法,至少现在我是这么认为…桶排序: 一个例子你就懂。8个数 3 6 2 7 9 8 1 1 申请一个9位的数组 int a[9];初始化所有a的值都为 0 然后3出现...
  • qq_23100787
  • qq_23100787
  • 2016-04-13 14:47:41
  • 355

图解排序算法:桶排序

排序算法概述 这里我讲的排序算法都是指内部排序算法,大致有九种,而内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序:   直接插入排序                ...
  • geek_hust
  • geek_hust
  • 2016-11-04 13:52:32
  • 211

【算法】桶排序

桶排序 桶排序(Bucket Sort)假设输入数据服从均匀分布,然后将输入数据均匀地分配到有限数量的桶中,然后对每个桶再分别排序,对每个桶再使用其他的排序算法,最后将每个桶中的数据有序的组合起来。前...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2015-11-19 13:18:59
  • 4811

js排序算法详解-桶排序

全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解js排序算法详解-桶排序一看到这个名字就会觉得奇特,几个意思,我排序还要再准备几个桶不成?还真别说,想用桶排序还得真准备几个桶...
  • luanpeng825485697
  • luanpeng825485697
  • 2017-09-21 20:18:51
  • 1733

桶排序和计数排序

桶排序和计数排序 桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排...
  • tiantangrenjian
  • tiantangrenjian
  • 2012-01-03 15:26:50
  • 2857

程序算法艺术与实践:经典排序算法之桶排序

桶排序Bucket Sort从1956年就开始被使用,该算法的基本思想是由E.J.Issac  R.C.Singleton提出来。本博介绍BucketSort算法相关知识。算法描述与伪代码假设输入的待...
  • utimes
  • utimes
  • 2015-09-19 19:27:13
  • 1730

经典排序算法(9)——桶排序算法详解

桶排序(Bucket sort)或所谓的箱排序,并不是比较排序,它不受到 O(nlogn) 下限的影响。 一、算法基本思想 (1)基本思想 桶排序工作的原理是将数组分到有限数量...
  • guoweimelon
  • guoweimelon
  • 2016-03-16 13:16:40
  • 447

《桶排序》

桶排序     又名箱排序,英文名字为Bucket sort,是一种排序算法,工作原理为将数组分到有限数量的桶子里。     桶排序是稳定的,且在大多数情况下常见排序里最快的一种,比快排还要快,缺点...
  • yxf15732625262
  • yxf15732625262
  • 2016-07-31 16:34:30
  • 651

【算法】排序之桶排序详解

【算法】排序之桶排序详解
  • LX18792732127
  • LX18792732127
  • 2017-06-15 10:28:02
  • 172

排序算法十:桶排序

排序算法十:桶排序 引言在我的博文《“主宰世界”的10种算法短评》中给出的首个算法就是高效的排序算法。本文将对排序算法做一个全面的梳理,从最简单的“冒泡”到高效的堆排序等。系列博文的上一篇讲述了基数排...
  • LG1259156776
  • LG1259156776
  • 2015-09-29 09:56:11
  • 18766
收藏助手
不良信息举报
您举报文章:桶排序
举报原因:
原因补充:

(最多只允许输入30个字)