比较排序,例如归并排序, 堆排序, 快速排序等等. 在比较排序中, 各元素的次序依赖于它们之间的比较.任何比较排序在最坏情况下都要经过O(nlogn)次比较.
快速排序的额外空间复杂度为O(logn),归并排序的空间复杂度为O(n),堆排序的空间复杂度为O(1)
桶排序
假设输入数据服从均匀分布, 平均情况下它的时间代价为O(n). 与计数排序类似,因为对输入数据做了某种假设, 桶排序的速度也很快.具体来说,计数排序假设数据都属于一个小区间内的整数, 而桶排序假设输入是由一个随机过程产生,该过程将元素均匀,独立地分布在[0,1]区间内.
桶排序将[0,1]区间划分为n个相同大小的子区间, 或称为桶.然后将n个输入数分别放在各个桶中.因为输入数据是均匀,独立地分布在[0,1]区间上,所以一般不会出现很多数落在同一个桶中的情况.为了得到输出结果, 先对每个桶中的数进行排序,然后遍历每个桶,按照次序将各个桶中的元素列出来即可.
桶排序是稳定排序.如果有两个键值相同的元素进行排序,那么这两个元素排序前后的相对位置不会改变.
1 | void bucketSort1(vector<int> &nums, int bucketSize) { |
另一种与桶排序相关的排序方法.
1 | // max是数组中元素的最大值, 数组中的元素都在0-max之间 |
计数排序
计数排序假设n个输入元素的每一个都是在0-k区间内的一个整数,其中k为某个整数.
计数排序的基本思想:对于每一个输入元素x, 确定小于x的元素个数,.利用这一信息,就可以直接把x放在它在输出数组中的位置上了.
1 |
|
基数排序
假设n个d位的元素存放在数组A中, 其中第1位是最低位, 第d位是最高位.
1 | radixSort(A, d) |