线性时间的排序 - Decision Tree Model & Counting Sort & Radix Sort & Bucket Sort

我们之前接触过的 O(nlogn) 算法如 merger sort, heap sort, quick sort 等都是通过挨个比较输入序列的大小来决定顺序的。

这些算法的平均时间复杂度都是O(nlogn)的,今天要学习的都是在线性时间完成排序的算法。


1. Decision Tree Model.

   决策树模型是通过一系列的基于一些数量的比较直接产生结果的排序方法。- 注意:其中这些比较可以看作是 一个个的boolean function.


以下就是一个简单的对有三个元素的数组的排序的决策树。 注意:1. 每个椭圆框中的数字代表的是数组的索引 2. 叶子节点的长方形框代表的是最终结果的索引序列

                                                      3. 无论是椭圆框还是长方型框中的索引的数字 必须大于等于1 小于等于的长度 (或者<= 0  && <= length - 1)


例子. [6, 8 ,5]  索引1 和 索引2 比较 6 < 8 进入 左边路径,索引2 和 索引3 比较 8 > 5, 进入右路径, 索引 1 和索引3 , 6 > 5 进入 右路径来到 叶子节点 [3, 1, 2] 即 5, 6, 8为最终结果

 

2. Counting Sort

  计数排序的原理很简单一句话,对于任意输入元素x, 通过计算在输入序列中的有多少个小于x的元素的数量,  将这个数量计作y, 那么在输出序列中 -  x 的位置就是 y. 对输入的序列有一定的要求,要求输入的序列的范围很小。

GitHub 代码实现 - 有注释 Github



3. Radix Sort

   基数排序, 是对每个元素的按照从个位到最高位依次进行排序。


A. 首先第一步, 对这一系列的数按照个位的大小进行排序,个位相同的数按照当前序列中的顺序排列。比如457 和 657 个位都是 7, 但是当前数列中457在657前面,那么在新的数列中我们还是将457放到657前面

B. 第二步, 对按照个位排好的结果的序列进行排序,规则是比较各个元素的十位上的数,十位上的数相同的按照第一步中的规则来

C. 第三部,按照百位的数进行排序。




4. Bucket Sort

   桶排序的原理也很简单,对于输入序列A,我们创建一个和它大小一样的序列B,在序列B中每个节点存储的是一系列范围的数,这个范围是由小到大并且是根据序列A中的数值而来的。例子如下

序列A中的数值如图, 数列B中的每个块存储的是一定范围中的数,比如 B[0] 中存储的是 0 - 0.1, B[1] 中存储的是 0.1 - 0.2.  其中B[0]中存储的是一个list, 这个list中的数是按照由大到小排列的. 当我们将A序列按照规则放到B序列中的之后, 我们就可以通过挨个输出B序列中的list. 得到final的result.



有问题欢迎指出!


猜你喜欢

转载自blog.csdn.net/ytdxyhz/article/details/53448792
今日推荐