桶排序,计数排序,基数排序
Posted 数据结构与算法学习笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了桶排序,计数排序,基数排序相关的知识,希望对你有一定的参考价值。
这三种排序的时间复杂度都为O(n),并且这几种排序不涉及元素之间的对比,所以时间复杂度是线性的,也叫做线性排序。
这三种排序都有特定的场景,重点是熟悉掌握这些排序算法的适用场景。
桶排序:
1.核心思想是将排序的数据分到几个有序的桶中,再将每个桶的数据进行排序,再将同中数据取出,按照顺序组成的序列即是有序的
2.当桶排序,取的桶个数和排序的数据个数很接近时,时间复杂度即为O(n)
3.桶排序要求排序的数据很容易可以划分成m个桶,要求桶之间有天然的排序,要求各个桶之间的分布比较均匀,极端情况下所有数据都分到一个桶,就变成了快排,时间复杂度变成O(nlogn)
4.桶排序比较适合用在外部排序。就是数据存储在外部磁盘,数据量较大,而内存大小有限,无法将所有数据全部加载到内存中
例子:假设有10GB的订单数据,想按照订单金额进行排序,但我们的内存只有100MB,可以利用桶排序,根据订单金额的大小,假设金额最大是10w,就可以将金额分到100个桶里,第一个桶是0-1000,第二个桶是1001-2000,以此类推,如果金额分布不均匀,某个桶还是大于100MB,可以再单独对那个桶进行分成10个桶,以此类推。
计数排序:
1.计数排序是桶排序的特殊情况,当n个数据所处范围不是很大时,就以范围内每个值当作一个桶,这样每个桶中的数据都是一样的,节省了桶中数据排序的时间。
2.最常见的就是高考的例子,高考总分是定的,每个分数的学生都非常多,以每个分数作为一个桶,桶中记录该分数学生的个数。
3.计数排序还有一个小技巧,每个桶是一个分数,桶中存储该分数学生的个数,而桶是默认从小到大排序的,对桶的数组进行累加,即可计算出小于等于每个桶(分数)的学生个数。假设最后一个桶是10分,有3个人,累加后总共有20个人,即可将(20-1)~(20-1-3)位置都填上10,以此类推组成学生成绩的数组
4.计数排序的只能适用数据范围不大的场景中,并且只能给非负整数进行排序,如果排序的数据是其他类型的,需要在不改变数据相对大小的情况下转为非负整数进行排序。比如数据范围是-1000~1000,即可将数据全部加1000进行排序
基数排序:
1.当数据值很大时,比如手机号,位数很多,不适合用桶排序和计数排序,即可用到基数排序
2.基数排序原理是根据最后一位以此往前进行排序,比如手机号,先根据最后一位进行排序,再根据倒数第二位,以此类推,排序11次后,手机号就变成有序的了,根据每一位排序可以用桶排序或计数排序实现。
3.当排序的数据是不等长时,可以对其进行补位,比如补0。补位后再进行排序
4.基数排序要求是可以分割出独立的位进行数据比较,且位之间有递进关系,如果a数据高位比b数据高位大,即可不需考虑低位。除此之外,每一位数据范围不能太大,要可以用线性排序来实现
总结:
1.桶排序和计数排序很相似,都是针对范围不大的数据,将数据划分为不同的桶进行排序。基数排序要求数据可以划分为高低位,位之间有递进关系。
以上是关于桶排序,计数排序,基数排序的主要内容,如果未能解决你的问题,请参考以下文章