桶排序java

import java.util.ArrayList;
import java.util.Iterator;
/**
* 桶排序:桶排序的思想是把区间[0,1)划分成n个相同大小的子区间,称为桶,然后将n个输入数分布到各个桶中去。
* 因为输入数均匀且独立分布在[0,1)上,所以,一般不会有很多数落在一个桶中的情况。
* 为了得到结果,先对各个桶中的数进行排序,然后按次序把各桶中的元素列出来。
* 桶排序的时间复杂度为O(n)
*/
public class BucketSort {

/**
* 桶排序算法,对arr进行桶排序,排序结果仍放在arr中
* @param arr
*/
static void bucketSort(double arr[]){
int n = arr.length;
ArrayList arrList[] = new ArrayList [n];
//把arr中的数均匀的的分布到[0,1)上,每个桶是一个list,存放落在此桶上的元素
for(int i =0;i<n;i++){
int temp = (int) Math.floor(n*arr[i]);
if(null==arrList[temp])
arrList[temp] = new ArrayList();
arrList[temp].add(arr[i]);
}
//对每个桶中的数进行插入排序
for(int i = 0;i<n;i++){
if(null!=arrList[i])
insert(arrList[i]);
}
//把各个桶的排序结果合并
int count = 0;
for(int i = 0;i<n;i++){
if(null!=arrList[i]){
Iterator iter = arrList[i].iterator();
while(iter.hasNext()){
Double d = (Double)iter.next();
arr[count] = d;
count++;
}
}
}
}
/**
* 用插入排序对每个桶进行排序
* @param list
*/
static void insert(ArrayList list){
if(list.size()>1){
for(int i =1;i<list.size();i++){
if((Double)list.get(i)<(Double)list.get(i-1)){
double temp = (Double) list.get(i);
int j = i-1;
for(;j>=0&&((Double)list.get(j)>(Double)list.get(j+1));j--)
list.set(j+1, list.get(j));
list.set(j+1, temp);
}
}
}
}
/**
* 测试.....
* 这里的测试数据是一个含n个元素的数组,且每个元素满足0<=arr[i]<1
*/
public static void main(String[] args) {
double arr[] = {0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68};
bucketSort(arr);
for(int i = 0;i<arr.length;i++)
System.out.println(arr[i]);
}
}

时间: 2024-07-29 23:03:51

桶排序java的相关文章

Java实现桶排序

详细讲解见<算法导论>8.4节--桶排序. Java代码如下: package linetimesort; import java.util.LinkedList; import sort.InsertSort; /** * 桶排序假设输入元素均匀而独立的分布在区间[0,1)上: * 桶排序的核心思想是,将[0,1)分为n个大小相同的子区间, * 上一个区间里的元素都比下一个区间里的元素小,然后对 * 所有区间里的元素排序,最后顺序输出所有区间里的元素, * 达到对所有元素排序的目的. * @

桶排序(BucketSort)(java)

一.原理 桶排序的工作原理是吧区间划分为n个大小相同的子区间,这样的区间称为桶.然后将n个输入的数分步到各个桶中去.每个桶再个别的排序,然后按照次序吧各个桶 中的元素列出来即可. 二.时间复杂度 桶排序是一种鸽巢排序的一种归纳结果.当要被排序阵列内的数值是均匀分配的时候,桶排序使用线性时间(O(n)).但桶排序并不是比较排序,它不受 O(nlongn)下限的影响. eg:对大小为[1...1000]范围内的n个整数A[1..n]排序.可以把桶设置为大小为10的范围,具体而言设集合B[1]存储[1

啊哈!算法之快速排序与桶排序

啊哈!算法之快速排序与桶排序 1.快速排序算法 快速排序由 C. A. R. Hoare(东尼·霍尔,Charles Antony Richard Hoare)在1960 年提出,之后又有许多人做了进一步的优化.在数列种随机找出一个基准数,因为数列是杂乱的,所以取首项为基准数.从后往前找到比基准数大的位置,再从前往后找到比基准数小的位置,交换元素:右游标向前移动与左游标向后移动,它们相遇时用基准数的位置与相遇的位置交换.此时原来数列以相遇的位置被划分为了两个需要排序的数列,再次执行上述过程:当左

排序算法&lt;No.2&gt;【桶排序】

算法,是永恒的技能,今天继续算法篇,将研究桶排序. 算法思想: 桶排序,其思想非常简单易懂,就是是将一个数据表分割成许多小数据集,每个数据集对应于一个新的集合(也就是所谓的桶bucket),然后每个bucket各自排序,或用不同的排序算法,或者递归的使用bucket sort算法,往往采用快速排序.是一个典型的divide-and-conquer分而治之的策略. 其中核心思想在于如何将原始待排序的数据划分到不同的桶中,也就是数据映射过程f(x)的定义,这个f(x)关乎桶数据的平衡性(各个桶内的数

Hark的数据结构与算法练习之桶排序

算法说明 桶排序的逻辑其实特别好理解,它是一种纯粹的分而治之的排序方法. 举个例子简单说一下大家就知道精髓了. 假如对11,4,2,13,22,24,20 进行排序. 那么,我们将4和2放在一起,将11,13放在一起,将22,24,20放在一起.  然后将这三部分分别排序(可以根据实现情况任意选择排序方式,我的代码中使用的是快排),将子数组排序后,再顺序输出就是最终排序结果了(大概应该明白了,我们是根据数字大小进行分组的,故而顺序输出即可) 怎么样,很简单吧. 具体实现大家看代码就行,我实现的其

三大线性排序之桶排序

一.概念引入 有作者把计数排序也称为桶排序(各个桶中元素的排序采用计数排序),得到数组C后直接从前往后遍历,输出数组值次数组下标,为0就不输出(或者存入原数组,不稳定),不过笔者认为这种说法不严谨(一个很明显的问题是输出会是双重for循环,不过也有那个意思,叫鸽巢排序也未尝不可),因为桶排序要求输入数据在[0,1)范围内(计数排序要求整数:实际上要么全是整数,要么小数,便于划分桶),先把区间[0,1)划分成n个相同大小的子区间,称为桶,然后将n个输入数分布到各个桶中去.因为输入数均匀且独立分布在

详解桶排序以及排序内容大总结(1)

比较器的使用 1) 比较器的实质就是重载比较运算符 2) 比较器可以很好的应用在特殊标准的排序上 3) 比较器可以很好的应用在根据特殊标准排序的结构上 import java.util.Arrays; import java.util.Comparator; import java.util.PriorityQueue; import java.util.TreeSet; public class Code03_Comparator { public static class Student {

基数排序与桶排序,计数排序【详解】

桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎,考得真是惨不忍睹(满分是10分).接下来将分

桶排序

假设现在有一组小于M的正整数 a1. a2 ,-- ,an ,对它们排序可以采用以下的思路:使用一个大小为M的数组buckets,这个数组的每一个单元称为一个个的bucket,桶,初始化全部为0.扫描数组a,当扫描到ai的时候,buckets[ai] 加1.这样当a扫描完之后,扫描buckets,打印非零单元的下标,它的值是几就打印几次.打印出来的值实际上就是排好序之后的数组a了.我们可以依次把它们赋值给a,使得a有序. 代码如下: #include<iostream> using names