package algorithm.sort;
import utils.com.ArrayLister;
/**
* 桶排序 O(n)
*
* @author Toy 排序的思想是把[0,1)划分为n个大小相同的子区间,每一子区间是一个桶。
* 然后将n个记录分配到各个桶中。因为关键字序列是均匀分布在[0,1)上的,所以一般不会有很多个记录落入同一个桶中。
* 由于同一桶中的记录其关键字不尽相同,所以必须采用关键字比较的排序方法(通常用插入排序)对各个桶进行排序,
* 然后依次将各非空桶中的记录连接(收集)起来即可
*/
public class BucketSort {
/**
* 矩阵模拟链表
* @param a
* @param m
* @param n
* @return
*/
public double[] bucket_sort(double[] a, int m, int n) {
double[][] buckets = new double[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
buckets[i][j] = -1;
}
}
for (int i = 0; i < a.length; i++) {
int region = (int) (10 * a[i]);
// System.out.println(region+" "+a[i]*10);
int lastIndex=0;
for (int k = 0; k < n; k++) {
if(buckets[region][k]<0){
lastIndex=k;
break;
}
}
// System.out.println("last Index : "+lastIndex);
for(int k=lastIndex;k>=0;k--){
if(lastIndex==0){
buckets[region][k]=a[i];
break;
}else{
// System.out.println(buckets[region][k-1]+" "+a[i]);
if(buckets[region][k-1]>a[i]){
buckets[region][k]=buckets[region][k-1];
}else{
buckets[region][k]=a[i];
break;
}
}
}
}
int k=0;
for(int i=0;i<m;i++){
if(buckets[i][0]<0){
continue;
}
for(int j=0;j<n;j++){
if(buckets[i][j]<0){
break;
}
// System.out.print(buckets[i][j]+" ");
a[k++]=buckets[i][j];
}
}
return a;
}
/**
* @param args
*/
public static void main(String[] args) {
double[] a = new double[] { 0.72, 0.18, 0.74, 0.32, 0.53, 0.64 };
ArrayLister.showArr(a);
BucketSort s = new BucketSort();
a= s.bucket_sort(a, 10, a.length);
ArrayLister.showArr(a);
}
}
桶排序
最新推荐文章于 2022-03-04 15:34:09 发布