C#排序算法——桶排序
生命中曾经有过的所有灿烂,终究都需用寂寞来偿还——《百年孤独》
“定义:将数组分到有限数量的桶子里。再将每个桶子进行排序”
桶排序是的升级版,在计数排序中有两个限制,数据不能为小数,且数据差不能过大。为了解决这两个限制于是桶排序就出现了。
桶排序的思路:先创建出一组桶,再将待排数据除以桶子的数量向下取整就是该进入的桶的下标,将数据全部放入桶内后,再使用前面学习过的排序算法,比如将桶内的数据排序,最后将桶里的数据按顺序取出来。
举个例子:6,2,10,1这组数,首先创建4个桶(数组),第一个数6/4向下取整就是第一个桶,同理2也是第一个桶,10是第三个桶,1是第一个桶,第二个桶和第四个桶就是空桶了(桶排序的弊端,浪费空间),再将第一三个桶排序,取出。
静图演示:
01
—
Code
下面使用C#代码进行实现:
/// <summary>
/// 桶排序 从小到大
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public float[] BucketSort(float[] array)
{
int bucketNums;
bucketNums = array.Length;
//初始化桶
List<float>[] List_bucket = new List<float>[bucketNums];
for (int i = 0; i < List_bucket.Length; i++)
{
List_bucket[i] = new List<float>();
}
//数据入桶
for (int i = 0; i < array.Length; i++)
{
List_bucket[(int)(array[i] / bucketNums)].Add(array[i]);
}
//将桶里的数据排序
for (int i = 0; i < List_bucket.Length; i++)
{
KuaiSuSort(List_bucket[i], 0, List_bucket[i].Count - 1);
}
//排好的数据按顺序出桶
List<float> List_Temp = new List<float>();
for (int i = 0; i < List_bucket.Length; i++)
{
for (int j = 0; j < List_bucket[i].Count; j++)
{
List_Temp.Add(List_bucket[i][j]);
}
}
return List_Temp.ToArray();
}
/// <summary>
/// 快速排序 从小到大
/// </summary>
private static void KuaiSuSort(List<float> Nums, int IndexLeft, int IndexRight)
{
if (IndexLeft < IndexRight)
{
float point = Nums[IndexLeft];
int left = IndexLeft;
int right = IndexRight;
while (left < right)
{
//从右往左找比point小的数
while (left < right && Nums[right] >= point)
{
right--;
}
//从左往右找比point大的数
while (left < right && Nums[left] <= point)
{
left++;
}
//将这两个数交换
Swap(Nums, left, right);
}
//全部完成后,将中值Point(数据中值)与中心数(位置中值)交换
Swap(Nums, IndexLeft, left);
//递归将数据中值的左右两边再排序
KuaiSuSort(Nums, IndexLeft, left - 1);
KuaiSuSort(Nums, left + 1, IndexRight);
}
}
/// <summary>
/// 交换数据
/// </summary>
private static void Swap(List<float> Nums, int index1, int index2)
{
float temp = Nums[index1];
Nums[index1] = Nums[index2];
Nums[index2] = temp;
}
END
感谢阅读
你知道的越多,你不知道的越多
我是EAST
一个靠互联网苟且偷生的程序员
咱们下期见!
扫描二维码关注我吧