package sort;
/**
* BucketSort
* 桶式排序算法:
* 基本思想:桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,
* 但这种排序方式需要待排序的序列满足以下两个特征:
* (1)待排序列所有的值处于一个可枚举的范围之类;
* (2)待排序列所在的这个可枚举的范围不应该太大,否则排序开销太大。
* 排序的具体步骤如下:
* (1)对于这个可枚举范围构建一个buckets数组,用于记录“落入”每个桶中元素的个数;
* (2)将(1)中得到的buckets数组重新进行计算,按如下公式重新计算:
* buckets[i] = buckets[i] + buckets[i-1] (其中1<=i<buckets.length);
*
*/
public class BucketSort
{
private int countStep = 0;
public void sort(int[] initData)
{
int len = initData.length;
int min = 0;
int max = 11;
// 缓存数组
int[] tmp = new int[len];
// buckets用于记录待排序元素的信息
// buckets数组定义了max-min个桶
// 其中min是数组中最小的数据
// max为数组中最大的数据 +1
int[] buckets = new int[max - min];
// 计算每个元素在序列出现的次数
for (int i = 0; i < initData.length; i++)
{
buckets[initData[i] - min]++;
countStep ++;
}
// 计算“落入”各桶内的元素在有序序列中的位置
for (int i = 1; i < max - min; i++)
{
buckets[i] = buckets[i] + buckets[i - 1];
countStep ++;
}
// 将initData中的元素完全复制到tmp数组中
for (int i=0; i<len; i++)
{
tmp[i] = initData[i];
}
//根据buckets数组中的信息将待排序列的各元素放入相应位置
for (int k = initData.length - 1; k >= 0; k--)
{
initData[--buckets[tmp[k] - min]] = tmp[k];
countStep ++;
}
}
public int showStep()
{
return countStep;
}
}