文字部分为转载:http://hxraid.iteye.com/blog/647759

对N个关键字进行桶排序的时间复杂度分为两个部分:

(1) 循环计算每个关键字的桶映射函数,这个时间复杂度是O(N)。

(2) 利用先进的比较排序算法对每个桶内的所有数据进行排序,其时间复杂度为  ∑ O(Ni*logNi) 。其中Ni 为第i个桶的数据量。

很显然,第(2)部分是桶排序性能好坏的决定因素。尽量减少桶内数据的数量是提高效率的唯一办法(因为基于比较排序的最好平均时间复杂度只能达到O(N*logN)了)。因此,我们需要尽量做到下面两点:

(1) 映射函数f(k)能够将N个数据平均的分配到M个桶中,这样每个桶就有[N/M]个数据量。

(2) 尽量的增大桶的数量。极限情况下每个桶只能得到一个数据,这样就完全避开了桶内数据的“比较”排序操作。当然,做到这一点很不容易,数据量巨大的情况下,f(k)函数会使得桶集合的数量巨大,空间浪费严重。这就是一个时间代价和空间代价的权衡问题了。

对于N个待排数据,M个桶,平均每个桶[N/M]个数据的桶排序平均时间复杂度为:

O(N)+O(M*(N/M)*log(N/M))=O(N+N*(logN-logM))=O(N+N*logN-N*logM)

当N=M时,即极限情况下每个桶只有一个数据时。桶排序的最好效率能够达到O(N)。

总结: 桶排序的平均时间复杂度为线性的O(N+C),其中C=N*(logN-logM)。如果相对于同样的N,桶数量M越大,其效率越高,最好的时间复杂度达到O(N)。 当然桶排序的空间复杂度 为O(N+M),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。此外,桶排序是稳定的。

package sort;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; //类名:Arrays_Bucket
//属性:
//方法:
class Arrays_Bucket{
private int[] arrays;
private int curNum; public Arrays_Bucket(int max) { //建立一个max长度的空数组
super();
arrays = new int[max];
curNum = 0;
} public void insert(int value){ //往空的数组里面增加元素
arrays[curNum] = value;
curNum++;
} public void display(){ //显示数组
System.out.println(Arrays.toString(arrays));
} public static final int ARRAY_SIZE = 10000; //数组中最大的数的值
public static final int BUCKET_SIZE=10; //桶的大小,桶的数量极限等于数组大小,就可以避免桶内的排序
public void BucketSort(){
ArrayList<ArrayList<Integer>> bucket=new ArrayList<ArrayList<Integer>>();
for(int i=0;i<BUCKET_SIZE;i++) //建立10个桶
{
bucket.add(new ArrayList<Integer>());
}
for(int i=0;i<arrays.length;i++) //按大小把数组分配到不同的桶中
{
int k=arrays[i]/(ARRAY_SIZE/BUCKET_SIZE);
// System.out.println("k="+k);
bucket.get(k).add(arrays[i]);
}
for(ArrayList<Integer> list:bucket) //对桶内的元素进行排序
Collections.sort(list);
for(ArrayList<Integer> list:bucket) //从小到大输出桶内的元素
System.out.println(list);
} } public class BucketSort { public static void main(String[] args) {
// TODO 自动生成的方法存根
int maxSize = 5;
Arrays_Bucket arrays_demo = new Arrays_Bucket(maxSize);
arrays_demo.insert(580);
arrays_demo.insert(570);
arrays_demo.insert(560);
arrays_demo.insert(600);
arrays_demo.insert(1590);
arrays_demo.display();
arrays_demo.BucketSort();
//arrays_demo.display();
} }

最新文章

  1. springboot(九):定时任务
  2. 【组合数学】 02 - M&#246;bius反演公式
  3. React的Diff算法
  4. Button,CheckBox,Lable,RadioButton,ComboBox,TextBox六个简单控件的使用
  5. js判断用户是否禁用了cookie
  6. Python.Scrapy.14-scrapy-source-code-analysis-part-4
  7. Redis安装及初步使用
  8. 面向切面编程AOP:基于注解的配置
  9. 【CImg】三角形绘制算法实现
  10. Financial Management
  11. UITableView、UICollectionView行高/尺寸自适应
  12. 【最大流ISAP】洛谷P3376模板题
  13. Python动态展现之一
  14. Java判断当前时间是否在某一时间段内
  15. xPath 用法总结整理
  16. java笔记----常见的异常
  17. Python脱产8期 Day014 2019/4/28
  18. 微信小程序选择视频,视频上传,视频播放
  19. 雷林鹏分享:Ruby 安装 - Unix
  20. 【jquery的setTimeOut定时器使用】

热门文章

  1. C# 实现酒店房态图
  2. 交叉编译总结 libosscore.a libcurl.a libmysqlclient.a
  3. Red Hat Enterprise Linux Server 6.5安装GCC 4.9.2
  4. strcat 函数的实现
  5. 使用Vmware虚拟机部署开发环境之Mac OS X系统安装
  6. 第13章 Java常用类
  7. 直线的参数方程ABC
  8. git clone Linux 源码并切换TAG
  9. WINDOW的cmd的命令【转载】
  10. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 所有的基础数据都可以恢复删除