O(N)不基于比较的排序算法

O(N)不基于比较的排序算法

1.计数排序,

2.基数排序.

这些排序算法可以通过不比较数组的项目来比时间复杂度为Ω(N log N)的基于比较的排序算法的下限更快。

我们都知道(在这个可视化中也没有证明,因为它需要花费一个小时的讲座来证明),所有基于比较的排序算法都具有Ω(N log N)的下限时间复杂度。

因此,任何具有最坏情况复杂度O(N log N)的基于比较的排序算法(如归并排序)都被认为是最优算法,即我们不能做得比这更好。
然而,如果存在输入数组的某些假设,我们可以避免比较这些项目来确定排序顺序, 然后实现更快的排序算法 - 比如在O(N)中

假设:如果要排序的项目是小范围的整数,我们可以计算每个整数(在这个小范围内)的出现频率,然后通过循环该小范围来按排序顺序输出项目。
在上面的示例数组中,对所有整数都在[1…9]内的示例数组尝试Counting Sort,因此我们只需要计算整数1出现的次数,出现整数2,…,出现整数9,然后遍历 如果频率 [y] = x,则 1至9 打印出整数 y 的 x 个副本。
时间复杂度为O(N)来计算频率,O(N + k)以排序顺序输出结果,其中 k 是输入的整数范围,在本例中为9-1 + 1 = 9。 计数排序(Counting Sort)的时间复杂度为O(N + k),如果 k 很小,那么它就是O(N)。
由于内存限制,当 k 相对较大时,我们将无法执行计数排序(Counting Sort)的计数部分,因为我们需要存储那些 k 个整数出现的次数。

假设:如果要排序的项目是大范围但小数位的整数,我们可以将计数排序(Counting Sort)思想与基数排序(Radix Sort)结合起来,以实现线性时间复杂度。

在基数排序中,我们将每个项目排序为一个 w 数字串(如果需要,我们填充小于w数字的前几个零的整数)。
对于最低有效位(最右边)到最高有效位(最左边),我们通过 N 个项目并将它们按照活动数字放到10个队列中(每个数字[0…9]一个),就好像 一个修改的计数排序,因为这保留了稳定性。 然后我们再次重新连接组,以便进行后续迭代。

请尝试上面示例数组的Radix Sort来了解更清晰的解释。
请注意,我们只执行O(w×(N + k))次迭代。 在这个例子中,w = 4,k = 10。

猜你喜欢

转载自blog.csdn.net/weixin_46689011/article/details/119301660