线性排序
线性排序的特点是非基于比较的排序算法,不涉及元素之间的比较操作。包括有桶排序、计数排序和基数排序
桶排序
- 原理:将要排序的数据分到几个天然有序的桶里,在每个桶中再进行单独排序,最后依次从桶中按顺序取出每个桶中的顺序即可
- 时间复杂度:O(n)
- 应用场景:适用于外部排序,即数据存储在外部磁盘中,数据量过大,而内存空间不够,即可将对应划分好的桶加入内存中进行排序。
- 限制性:要排序的数据能容易的被划分为m个具有天然顺序的桶且每个桶中的数据分布要尽可能的均匀。
计数排序
-
原理:计数排序是桶排序的一种特殊情况,若要排序的m个数据,数据范围不大,假设最大值为k,则划分为k个桶,m个数据就根据每个桶的值落在对应的桶中,再依次按桶中取数据即可。
有数组A[8]:2,5,3,0,2,3,0,3,计数排序如图:其中0-5表示桶的值。
-
计数排序与桶排序的区别
桶排序的桶存储的是一个范围内的值,存储的数据,在这个桶内数据还要进行排序;而计数排序的桶存储的是对应的桶的值的元素的个数,无需再在桶中进行排序,一个桶中的值都是一样的。 -
计数算法
(1)设待排序数组A[8]:2,5,3,0,2,3,0,3,桶为c[6]:
(2)将桶c[6]进行顺序求和,数组变为:2,2,4,7,7,8,c[k]表示小于等于k的元素个数。
(3)从后往前扫描数组A(为了保持算法的稳定性),首先扫描到了3,c[3]=7,表示小于等于3的个数有7个,则将这个3放在临时数组R的第6个位置上,同时将c[3]的值减一。以此类推
- 限制性:计数排序只能用于数据范围不大的场景中且只能给非负整数的数据进行排序,若有负数或非整数都需要转换为非负整数。
- 时间复杂度:O(n)
基数排序
- 原理:若排序的数据可以分割成独立的位来比较,位之间有递进关系,且若a数据的高位比b的大,则剩下的位无需比较。例:手机号码的比较,从后往前依次比较,需保证每次比较是稳定的,只需比较11次即可。
- 时间复杂度:O(n)
总结
对于排序算法的使用应灵活,不能仅仅看时间复杂度进行选择。时间复杂度表示的是一种增长的趋势,且忽略了常量、低阶系数,这两者的值过大时也会对时间复杂度的值产生影响。
例O(n^2)的时间复杂度不一定差于O(nlogn),假设O(nlogn)实际为O(knlogn+c),若n=100,k=c=1000
O(n^2)=100100=10000
O(knlogn+c)=1000100*log100+1000>10000
以上所有图片来源于王真——数据结构与算法之美