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
一个靠互联网苟且偷生的程序员
咱们下期见!
扫描二维码关注我吧
