zoukankan      html  css  js  c++  java
  • 算法与数据结构——排序(十一)桶排序

          前面我们学习了基数排序,下面我们来看一种跟基数排序类似的排序算法桶排序。在基数排序里面,我们也用到了桶的概念,在基数排序的例子里面,我们是先把个位数相同的数放到一个桶里面,然后把十位数相同的放在一个桶里面,然后再把百位数相同的放在一个桶里面,最后整个序列就是有序的了。而在桶排序里, 它的思想是,先按照某个规律把数组中的所有数字都放到不同的桶内,然后把每个桶内的数据当作一个待排数组,然后使用其他的排序方式进行排序。也就是它只把数据分配到桶中一次。假设我们是按照百位数相同的放在一个桶内,那么桶排序的过程可以描述为:

    image

          具体实现代码如下:

    /// <summary>
    /// 桶排序
    /// </summary>
    /// <param name="sortList">待排序列</param>
    /// <param name="barrelSize">桶的个数</param>
    /// <param name="numCount">序列中最大数的位数</param>
    public void BaSort(List<int >sortList,int numCount)
    {
        int[] tempResult = new int[sortList.Count];
        int[] tempList = new int[10];
     
        for (int j = 0; j < sortList.Count; j++)
        {
            //百位数相同就把它们放在相同的桶内 tempList[m]记录的是百位数为m的数的个数
            int m = Convert.ToInt32(sortList[j] % Math.Pow(10, numCount) / Math.Pow(10, numCount - 1) + 0.5) - 1;
            tempList[m] += 1;
        }
     
        for (int j = 0; j < sortList.Count; j++)
        {
            int m = Convert.ToInt32(sortList[j] % Math.Pow(10, numCount) / Math.Pow(10, numCount - 1) + 0.5) - 1;
            int sumCount = 0;
            for (int k = 0; k < m; k++)
            {
                sumCount += tempList[k];
            }
            //sumCount是代表每一个数插入即将插入到数组中的位置
            int teCount = sumCount;
            //tempResult记录的是最终的结果,如果tempResult[sumCount] != 0不等于0,代表这个位置已经有一个数插入进来了,
            //当前数插入的位置就要后移
            while (tempResult[sumCount] != 0)
            {
                sumCount++;
            }
            int temp = sortList[j];
            if (sumCount != 0 && sortList[j] < tempResult[sumCount - 1])
            {
                //下面的代码是对百位数相同的数,在插入的时候,进行排序(使用的是插入排序的方法)
                int n = 0;
                for (n = sumCount - 1; n >= teCount; n--)
                {
                    if (temp < tempResult[n])
                    {
                        tempResult[n + 1] = tempResult[n];
                    }
                }
                tempResult[n + 1] = temp;
            }
            else
            {
                tempResult[sumCount] = temp;
            }
        }
    }
  • 相关阅读:
    Webpack 如何在每次构建之前自动清理构建目录
    Webpack 代码压缩 js、CSS、HTML压缩
    Webpack 三种文件指纹策略 js、css、图片字体资源的指纹设置
    Webpack热更新以及原理分析 webpack-dev-server与webpack-dev-middleware WDS WDM
    Webpack中的文件监听 watch配置实时更新
    【神经网络结构搜索】DNA: Block-wisely Supervised NAS with KD
    DeiT:使用Attention蒸馏Transformer
    ECCV20 BigNAS无需后处理直接部署
    实现数据逻辑与业务的解耦,模板文件填入你需要的数据,框架自动去请求相关数据
    推荐一个离线应用框架-lcache.js
  • 原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/2788470.html
Copyright © 2011-2022 走看看