【愚公系列】2021年11月 C#版 数据结构与算法解析(桶排序)

简介: 【愚公系列】2021年11月 C#版 数据结构与算法解析(桶排序)

1、桶排序(Bucket Sort)

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。


1.1 算法描述

设置一个定量的数组当作空桶;

遍历输入数据,并且把数据一个一个放到对应的桶里去;

对每个不是空的桶进行排序;

从不是空的桶里把排好序的数据拼接起来。

1.2 图片演示

image.png


1.3 代码实现

/// <summary>

/// 桶排序

/// </summary>

public class Program {

   public static void Main(string[] args) {

       double[] array = { 0.43, 0.69, 0.11, 0.72, 0.28, 0.21, 0.56, 0.80, 0.48, 0.94, 0.32, 0.08 };

       BucketSort(array, 10);

       ShowSord(array);

       Console.ReadKey();

   }

   private static void ShowSord(double[] array) {

       foreach (var num in array) {

           Console.Write($"{num} ");

       }

       Console.WriteLine();

   }

   public static void BucketSort(double[] array, int bucketNum) {

       //创建bucket时,在二维中增加一组标识位,其中bucket[x, 0]表示这一维所包含的数字的个数

       //通过这样的技巧可以少写很多代码

       double[,] bucket = new double[bucketNum, array.Length + 1];

       foreach (var num in array) {

           int bit = (int)(10 * num);

           bucket[bit, (int)++bucket[bit, 0]] = num;

       }

       //为桶里的每一行使用插入排序

       for (int j = 0; j < bucketNum; j++) {

           //为桶里的行创建新的数组后使用插入排序

           double[] insertion = new double[(int)bucket[j, 0]];

           for (int k = 0; k < insertion.Length; k++) {

               insertion[k] = bucket[j, k + 1];

           }

           //插入排序

           StraightInsertionSort(insertion);

           //把排好序的结果回写到桶里

           for (int k = 0; k < insertion.Length; k++) {

               bucket[j, k + 1] = insertion[k];

           }

       }

       //将所有桶里的数据回写到原数组中

       for (int count = 0, j = 0; j < bucketNum; j++) {

           for (int k = 1; k <= bucket[j, 0]; k++) {

               array[count++] = bucket[j, k];

           }

       }

   }

   public static void StraightInsertionSort(double[] array) {

       //插入排序

       for (int i = 1; i < array.Length; i++) {

           double sentinel = array[i];

           int j = i - 1;

           while (j >= 0 && sentinel < array[j]) {

               array[j + 1] = array[j];

               j--;

           }

           array[j + 1] = sentinel;

       }

   }

}

1.4 算法分析

桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。


相关文章
|
26天前
|
机器学习/深度学习 存储 算法
如何评判算法好坏?复杂度深度解析
如何评判算法好坏?复杂度深度解析
24 0
|
29天前
|
机器学习/深度学习 算法 PyTorch
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
216 1
|
25天前
|
存储 NoSQL 算法
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)(二)
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)
36 0
|
28天前
|
缓存 算法 C语言
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
46 0
|
15天前
|
存储 缓存 算法
深度解析JVM世界:垃圾判断和垃圾回收算法
深度解析JVM世界:垃圾判断和垃圾回收算法
|
16天前
|
存储 算法
【算法与数据结构】深入解析二叉树(二)之堆结构实现
【算法与数据结构】深入解析二叉树(二)之堆结构实现
|
20天前
|
存储 算法
从动态规划到贪心算法:最长递增子序列问题的方法全解析
从动态规划到贪心算法:最长递增子序列问题的方法全解析
19 2
|
29天前
|
存储 算法 Serverless
【软件设计师备考 专题 】数据结构深度解析:从数组到图
【软件设计师备考 专题 】数据结构深度解析:从数组到图
56 0
|
29天前
|
机器学习/深度学习 存储 Java
揭秘数组:数据结构的基石与代码实践解析
揭秘数组:数据结构的基石与代码实践解析
9 0
|
30天前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。

热门文章

最新文章

推荐镜像

更多