桶排序与基数排序、计数排序

来源:互联网 发布:新晨科技 知乎 编辑:程序博客网 时间:2024/05/22 14:12

桶排序算法 与 基数排序算法(二者有相通之处)

-----------------------------------------------------------

基数排序


73, 22, 93, 43, 55, 14, 28, 65, 39, 81   :待排序数组

------------------->

首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39

-------------------------->

第二步:
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93
----------------------------->

第三步:
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93

这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止

-------------------

桶排序

桶排序是在已经数据的范围的条件下,创建若干个桶,根据相应的比较规则将待排数据落入各个对应的桶中,最后扫描 桶 来实现排序。桶排序需要的附加条件:数据的范围已知。

排序是稳定的;桶排序是常见排序里最快的一种,比快排还要快(大多数情况下);桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法。

假设有一组长度为N的待排关键字序列K[1....n]。首先将这个序列划分成M个的子区间(桶) 。然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) ,那么该关键字k就作为B[i]中的元素(每个桶B[i]都是一组大小为N/M的序列)。接着对每个桶B[i]中的所有元素进行比较排序(可以使用快排)。然后依次枚举输出B[0]....B[M]中的全部内容即是一个有序序列。

假如待排序列K= {49、 38 、 35、 97 、 76、 73 、 27、 49 }。这些数据全部在1—100之间。因此我们定制10个桶,然后确定映射函数f(k)=k/10。则第一个关键字49将定位到第4个桶中(49/10=4)。依次将所有关键字全部堆入桶中,并在每个非空的桶中进行快速排序。





.......................................................................................................................

计数排序(又或者投票排序)

当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。

计数排序的过程类似小学选班干部的过程,如A得10票,B得9票,那A是班长,B是副班长

大体分两部分,第一部分是拉选票和投票,第二部分是根据你的票数入位。

--->

待排数组[ 6 2 4 1 5 9 ]

票箱数组[ 4 0 0 0 0 0 ]

--->

投票完毕时的状态是这样

待排数组[ 6 2 4 1 5 9 ]

票箱数组[ 4 1 2 0 3 5 ]

--->

重新入位

入桶前 [ 0 1 2 3 4 5 ] //里边的数字表示位置编号

入桶后 [ 1 2 4 5 6 9 ] //1有0票,进的0号位置






原创粉丝点击