桶排序_C#

桶排序是由计数排序衍生,我们知道计数排序需要先建立一个给定范围大小的列表,

如果元素范围是0-1亿呢,那么我们需要将这个列表分割成几个小范围,比如0-49范围分为0-9 10-19 20-29 30-39 40-49,也就是分

成几个桶

桶排序(Bucket Sort):首先将元素分在不同的桶中,在对每个桶中的元素排序。 

    /// <summary>
    /// n就是几个桶,maxCount是范围
    /// </summary>
    /// <param name="li"></param>
    /// <param name="n"></param>
    /// <param name="maxCount"></param>
    public void BucketSort(List<int> li,int n, int maxCount)
    {
        List<List<int>> buckets = new List<List<int>>(n);//二维列表
        for (int i = 0; i <n; i++)
        {
            buckets.Add(new List<int>());
        }
        for (int i = 0; i < li.Count; i++)
        {
            int j =Mathf.Min( li[i] / (maxCount / n),n-1);//j表示改放的哪个桶,不能大于n-1
            buckets[j].Add(li[i]);//放入对应桶
            for (int x = buckets[j].Count-1; x >0 ; x--)//放一个排序一次,两两对比就可以
            {
                if (buckets[j][x]<buckets[j][x-1])//升序
                {
                    int tmp = buckets[j][x];//交换
                    buckets[j][x] = buckets[j][x - 1];
                    buckets[j][x - 1] = tmp;
                }
                else
                {
                    break;//如果不发生交换直接退出,因为前面的之前就排序好了
                }
            }
        }
        li.Clear();//输出
        for (int i = 0; i < buckets.Count; i++)
        {
            li.AddRange(buckets[i]);
        }
    }

 

测试一下 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值