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

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

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;
        }
    }
}
原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/2788470.html