桶排序
桶排序是时间为o(n)的算法,属于用空间换取时间的算法,总结其用途可以有以下几点
1.实现按规则的排序.
2.求数据之间最大的间距.
3.求数据之间间距最大的三个数.
4.求时间复杂度为o(n)的排序算法.
......等
-------------------------------------------------------------------------------------------------------------------------------------------------------
算法思路:
1.待更新...
-------------------------------------------------------------------------------------------------------------------------------------------------------
上代码:
存放桶数据的类:
public class tagSBucket {
boolean isValid;
int max;
int min;
void add(int n)
{
if(n<min)
{
min=n;
}
if(n>max)
{
max=n;
}
}
public boolean isValid() {
return isValid;
}
public void setValid(boolean isValid) {
this.isValid = isValid;
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
public int getMin() {
return min;
}
public void setMin(int min) {
this.min = min;
}
}
代码实现:
import java.util.ArrayList;
public class Buckstsort {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] data = new int[] { 1, 14,31, 22, 66};
Bucketsort(data, data.length);
}
private static void Bucketsort(int[] data, int len) {
// TODO Auto-generated method stub
// 创建对象,并初始有效性为false
ArrayList<tagSBucket> arr = new ArrayList<tagSBucket>();
for (int i = 0; i < len; i++) {
tagSBucket temp = new tagSBucket();
temp.setValid(false);
arr.add(temp);
}
// 把数据分别放到对应的桶内
// 首先找对应的桶,那么就需要数组的最大值和最小值
int min = data[0];
int max = data[0];
for (int i = 1; i < len; i++) {
if(data[i]>max)
{
max=data[i];
}
if(data[i]<min)
{
min=data[i];
}
}
//初始化桶中max和min的值
for(int k=0;k<len;k++)
{
//第几个桶
int Bucket=(data[k]-min)*len/(max-min);
System.out.println(k+"----"+Bucket);
if(Bucket>=len)
{
Bucket=Bucket-1;
}
/* System.out.println(Bucket*(max-min)/len);
System.out.println(min+Bucket*(max-min)/len);
System.out.println((min+Bucket*(max-min)/len));*/
arr.get(Bucket).setMin(data[k]);
arr.get(Bucket).setMax(data[k]);
}
//接下来就要放到对应的桶上
for(int j=0;j<len;j++)
{
//第几个桶
int Bucket=(data[j]-min)*len/(max-min);
if(Bucket>=len)
{
Bucket=Bucket-1;
}
arr.get(Bucket).setValid(true);
arr.get(Bucket).add(data[j]);
}
//输出结果
int b=0;
int result=0;
for(int a=0;a<len;a++)
{
if(arr.get(a).isValid())
{
int resultTemp=arr.get(a).getMin()-arr.get(b).getMax();
if(resultTemp>result)
{
result=resultTemp;
}
b=a;
}
}
System.out.println(result);
}
}
输出结果:
0----0
1----1
2----2
3----1
4----5
35