桶排序是由计数排序衍生,我们知道计数排序需要先建立一个给定范围大小的列表,
如果元素范围是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]);
}
}
测试一下