桶排序是将待排序集合中处于同一个值域的元素存放在同一个桶中1。java
假设有一个班级有5我的,此次期末他们分别考了5分,2分,4分,5分,8分(满分为10分)。须要将这些分数从小到大排序算法
首先咱们申请一个大小为11的数组int bucket[11]。在最开始的时候咱们都把该数组的元素bucket[0]~bucket[10]都初始化为0,表示这些分数都尚未人获得过。例如bucket[0]表示的是目前尚未人获得0分,bucket[8]表示的是目前尚未人获得8分。
数组
public class SimpleBucketSort { public static void main(String[] args) { // 下面是学生取得的分数,假设分数最大为10 int[] a = {5,3,5,2,8}; // 建立11个分数层,a[0]=0:表示分数为0分的出现0我的 int[] bucket = new int[11]; for(int i = 0; i < a.length; i++) { // 出现分数为a[i]的有barrel[a[i]]我的 bucket[a[i]]++; } // 打印 for (int i = 0; i < bucket.length; i++) { // 出现几回就打印几回 for(int j = 1; j <= bucket[i]; j++) { System.out.print(i + " "); } } } }
在初始化桶时,须要循环n次(n为桶的个数,在java语言中默认都已经初始化为0),在把分数放入桶中时,循环了m次(m为待排序的个数),而在打印时一共循环了(m+n)次,因此整个排序算法一共执行了(n+m+m+n)次。用大写的O来表示时间复杂度,所以该算法的时间复杂度为O(n+m+m+n),即O(2(n+m))。可是通常在说时间复杂度时都是忽略常数,也就是桶排序的最终时间复杂度为O(m+n),而且通常字母都得大写表示,即O(M+N)。spa
桶排序所占用的空间比较糟糕,很是浪费空间,若是要排序的数的范围在0~10000000000000,那得建立出10000000000001个变量。建立N个桶,而且待排序的数为M,那么空间复杂度为O(N+M)。设计
速度是比较快的,从上面的时间复杂度能够看出。3d
比较浪费空间,假设待排序的数中有一个元素值为2100000000000,那么必须建立一个大于2100000000000的桶数。code
// 打印(去重) for(int i = 0; i < barrel.length; i++) { if(barrel[i] != 0) { // 打印的是分数 System.out.print(i + " "); } }