• 算法与数据结构——排序(十一)桶排序


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

    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;
            }
        }
    }
  • 相关阅读:
    Spring Boot 7:配置文件信息读取
    Spring Boot 6:自定义filter
    Spring AOP:Java动态代理和CGlib
    Spring AOP:概念
    设计模式(二)---策略模式
    设计模式(一)--装饰模式
    java并发编程实战笔记
    剑指offer java -查找旋转数组的最小数字
    读书计划
    协议初学
  • 原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/2788470.html
Copyright © 2020-2023  润新知