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