vlambda博客
学习文章列表

C#排序算法——桶排序

This browser does not support music or audio playback. Please play it in Weixin or another browser.
  • 命中曾经有过的所有灿烂,终究都需用寂寞来偿还——百年孤独


“定义:将数组分到有限数量的桶子里。再将每个桶子进行排序


——前言:

    桶排序是的升级版,在计数排序中有两个限制,数据不能为小数,且数据差不能过大。为了解决这两个限制于是桶排序就出现了。


桶排序的思路:先创建出一组桶,再将待排数据除以桶子的数量向下取整就是该进入的桶的下标,将数据全部放入桶内后,再使用前面学习过的排序算法,比如将桶内的数据排序,最后将桶里的数据按顺序取出来。


举个例子: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

一个靠互联网苟且偷生的程序员

咱们下期见!




扫描二维码关注我吧



庚子年冲冲冲 发起了一个读者讨论 留言区