排序(五)——关于桶式排序
来源:互联网 发布:原单厂家直拿wsj淘宝 编辑:程序博客网 时间:2024/04/30 19:48
假设现在有一组小于M的正整数 a1、 a2 ,…… ,an ,对它们排序可以采用以下的思路:使用一个大小为M的数组buckets,这个数组的每一个单元称为一个个的bucket,桶,初始化全部为0。扫描数组a,当扫描到ai的时候,buckets[ai] 加1。这样当a扫描完之后,扫描buckets,打印非零单元的下标,它的值是几就打印几次。打印出来的值实际上就是排好序之后的数组a了。我们可以依次把它们赋值给a,使得a有序。
代码如下:
- publicvoid bucketSort(int[] a,int max){
- //注意了,这里 max > a[i],即 max 大于a中最大值
- int[] buckets=newint[max];
- for(int i=0;i<a.length;i++)
- buckets[a[i]]++;
- int j=0;
- for(int i=0;i<buckets.length;i++)
- for(int k=1;k<=buckets[i];k++)
- a[j++]=i;
当然,上面的思路应该还称不上桶式排序法。都说桶排是稳定的排序法,显然上面的最后一步的做法毫无稳定性可言。为了保证稳定性,做了修改如下:
- publicvoid bucketSort(int[] a,int max){
- //注意了,这里 max > a[i],即 max 大于a中最大值
- int[] buckets=newint[max];
- for(int i=0;i<a.length;i++)
- buckets[a[i]]++;
- / 计算“落入”各桶内的元素在有序序列中的位置
- for (int i =1; i < max; i++) {
- buckets[i] = buckets[i] + buckets[i - 1];
- }
- // 将a的元素完全复制到tmp数组中
- int tmp[] = Arrays.copyOf(a, a.length);
- // 根据buckets数组中的位置信息将待排序列的各元素放入相应位置
- for (int k = a.length -1; k >= 0; k--) {
- a[--buckets[tmp[k]]] = tmp[k];
- }
搜到了这篇文章:http://blog.csdn.net/apei830/article/details/6596057
他的参数有 min 和 max ,我在论坛上问了一下,有人说好处有两个:1、支持负数; 2、高位区间:比如 9000 ~ 10000; 的确是这样。那我就把他的代码拷过来吧,以备后用。这应该算是最优秀的代码了吧?
- public staticvoid bucketSort(int[] data,int min, int max) {
- // 缓存数组
- int[] tmp = newint[data.length];
- // buckets用于记录待排序元素的信息
- // buckets数组定义了max-min个桶
- int[] buckets = newint[max - min];
- // 计算每个元素在序列出现的次数
- for (int i =0; i < data.length; i++) {
- buckets[data[i] - min]++;
- }
- // 计算“落入”各桶内的元素在有序序列中的位置
- for (int i =1; i < max - min; i++) {
- buckets[i] = buckets[i] + buckets[i - 1];
- }
- // 将data中的元素完全复制到tmp数组中
- System.arraycopy(data, 0, tmp, 0, data.length);
- // 根据buckets数组中的信息将待排序列的各元素放入相应位置
- for (int k = data.length -1; k >= 0; k--) {
- data[--buckets[tmp[k] - min]] = tmp[k];
- }
- }
- 排序(五)——关于桶式排序
- 排序(五)——关于桶式排序
- (五)简单排序—选择排序
- 排序算法(五)——快速排序
- 排序算法(五)——简单选择排序
- 算法——排序(五)选择排序
- 排序算法之 —— 快速排序(五)
- 排序算法(五)——快速排序
- 排序算法(五) —— 快速排序
- 排序算法(五)——快速排序
- 八种排序方法(五)——希尔排序
- 排序算法五——堆排序
- 排序算法五—归并排序
- 排序算法五:桶排序
- 排序(五):冒泡排序
- 排序(五):堆排序
- 排序—桶排序
- 程序猿找工作必练内功:排序算法大总结(五)——线性时间排序算法(计数排序,基数排序,桶排序)
- smarty3的一些实用的新特性
- Suse环境File.mkdirs()创建的目录判断是否可写返回false的问题
- TCP三次握手与四次挥手!
- java基础知识4-变量比较,类型转换
- oracle 监听无法启动处理
- 排序(五)——关于桶式排序
- hdu 4771好题
- 二叉树的遍历
- POJ 1502 MPI Maelstrom
- 某应用出现启动后集群中部分node成功,部分node失败
- 查找冲突的jar文件
- 二分(折半)查找
- git获取Spring framework,用gradle构建并打包,maven负责依赖
- hdu 4784 Dinner Coming Soon