桶式排序算法

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;
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值