这三种排序算法分别是桶排序、计数排序和基数排序,之所以它们的时间复杂度能到达O(n),是因为它们都是非基于比较的排序算法,不涉及元素之间的比较操作。
1 桶排序
1.1 原理
将待排数据元素分配到几个有序的桶中,然后对每个桶中的数据元素分别进行排序,每个桶中的数据元素有序后按桶的顺序将数据元素依次取出,这样整个序列就有序。
1.2 算法分析
1.2.1 时间复杂度
假设待排序列数据元素个数为n,桶的数量为m;那么平均每个桶中的数据元素个数为k = n / m,对每个桶中的数据元素进行快速排序,那么每个桶中的时间复杂度为O(k * logk),也就是(n / m) * O(log (n / m)),总的时间复杂度为O(n * log(n / m));当桶的个数m接近数据元素个数时,那么log(n / m)就是一个常数,此时时间复杂度为O(n)。
1.2.2 空间复杂度
实现过程中,所有桶大小之和等于待排序列数据元素个数;对桶内数据元素进行排序时,可以使用快速排序和归并排序,快速排序的时间复杂度为O(1),归并排序的时间复杂度为O(n);所以桶排序的时间复杂度为O(n)。
1.2.3 稳定性
桶排序的稳定性与桶内元素排序算法是否稳定有关,如果桶内排序算法是稳定的,那么桶排序也是稳定的,反之,则桶排序不是稳定的。
1.2.4 适用场景
1)待排数据元素在一定区间内分布均匀,可以容易的划分到桶中,而且各个桶中的数据元素个数均匀;
2)桶排序比较适用于外部排序,外部排序就