1、什么是桶排序?
桶排序从整体来看也是一个非比较排序,是计数排序的升级版,其主要是先把序列中的数据划分为一个个的范围,每个范围相当一个桶,将数据放入桶中,每个桶分别进行排序,然后取出拼接即可。计数排序不适用于序列中max-min范围较广或者序列中的数据不是整数的情况,但是桶排序没有这些限制,其主要步骤是将数据放入桶中,桶中的数据自己排序。
2、桶排序的应用场景
桶排序适用于序列中元素的分布比较均匀的场景,这样其划分的每个桶中的数据比较均匀,排序较快,如果不均匀会导致数据被分配到一个桶里面,这会使其他的桶没用,其消耗的时间就主要靠这个桶所使用的排序算法了。
3、桶排序的思想
桶排序的思想是:将数据放入桶中,每个桶中的元素分别进行排序,其实就是一种用空间换时间的算法,还包含一种分治思想。
4、桶排序的步骤
步骤:
1、取序列中的最大值max和最小值min,取桶的个数 为(max-min)/arr.length+1个桶,桶的 范围是arr.length,其中的加1是为解决桶是(arr[i]-min)/arr.length作为索引,则当是最大值时,最大索引是(arr[i]-min)/arr.length,则总的数量为(arr[i]-min)/arr.length+1。
2、遍历序列,则将其放入到(arr[i]-min)/arr.length的桶中
3、每个桶中的元素分别做快速排序
4、遍历所有的桶,则完成了排序
5、代码
static void BucketSort(int[] array, int len, int bucketsize = 4)
{
//获取数组的最大值与最小值
(int max, int min) = FindMaxAndMin(array, len);
List<List<int>> buckets = new List<List<int>>();
//分配的桶数量
int bucketnum = (max - min) / bucketsize + 1;
for (int i = 0; i < bucketnum; i++)
{
buckets.Add(new List<int>());
}
for (int i = 0; i < len; i++)
{
int bucketIndex = (array[i] - min) / bucketsize;
buckets[bucketIndex].Add(array[i]);
}
int index = 0;
for (int i = 0; i < buckets.Count; i++)
{
buckets[i].Sort();
for (int j = 0; j < buckets[i].Count; j++)
{
array[index++] = buckets[i][j];
}
}
}
static (int, int) FindMaxAndMin(int[] array, int len)
{
(int min, int max) = (array[0], array[0]);
for (int i = 1; i < len; i++)
{
min = Math.Min(min, array[i]);
max = Math.Max(max, array[i]);
}
return (max, min);
}