我想到了一个复杂度还行的排序算法,运用了分块、归并思想。
算法流程如下:
- 输入数组 a1..n。
- 把数组分成 n 个块,每个块 n 个数。
- 对每个块进行平方级复杂度的简单排序。
- 运用类似归并的思想,重复 n 次,遍历 n 个块的头部,取出最小值放进答案数组。
复杂度分析:
- 输入:O(n) 的。
- 对每个块进行简单排序:因为简单排序是平方级的,有 n 个块,每个块 n 个数,所以这一步的复杂度是 O(n⋅(n)2)=O(nn)。
- 归并:考虑到最坏情况下,n 个块都要被遍历 n 次,这一步的复杂度为 O(nn)。
故总的复杂度为 O(nn)。
在我看来,这个算法有如下优点:
- 复杂度不算太高。在如今 CCF 少爷机、打开
-O2 编译开关的大背景下跑得过去。
- 实现简单。简单排序、归并的实现都不难。
- 排序稳定。有很多稳定的简单排序,归并的过程也是稳定的。
各位怎么评价这个算法?它还可以有怎样的优化?