我正在寻找一种O(n)排序算法,其中n是要排序的元素数。我知道高度优化的排序算法是O(n log n)但我被告知在以下条件下我们可以做得更好。条件是:
答案 0 :(得分:0)
说我们有以下
unsortedArray = [4, 3, 4, 2]
以下是算法:
步骤1)迭代unsortedArray
并将每个元素用作我们称为countingArray
的新数组的索引。我们在每个位置保留的值是该数字出现的次数的计数。每次我们访问一个位置时,我们都会将它递增1。
countingArray = [0, 0, 0, 0, 0, ..., 0, 0, 0, 0] // before iteration
countingArray = [0, 0, 0, 0, 1, ..., 0, 0, 0, 0] // after handling 4
countingArray = [0, 0, 0, 1, 1, ..., 0, 0, 0, 0] // after handling 3
countingArray = [0, 0, 0, 1, 2, ..., 0, 0, 0, 0] // after the second 4
countingArray = [0, 0, 1, 1, 2, ..., 0, 0, 0, 0] // after handling 2
我们可以提前分配countingArray
,因为我们希望排序的数字范围是有限的并且是先验已知的。在您的示例中,countingArray
将包含101个元素。
此步骤的时间复杂度为O(n),因为您正在迭代来自unsortedArray
的n个元素。将它们插入countingArray
具有恒定的时间复杂度。
步骤2)如上例所示,countingArray
将具有值为0的位置,其中unsortedArray
中没有要计数的数字。我们将在下面的迭代中跳过这些位置,我们将对此进行描述。
在countingArray
非零位置定义我们要排序的数字,该位置的内容定义计数多少次号码应出现在最终sortedArray
。
我们迭代countingArray
并从sortedArray
的第一个位置开始,将数字放入计数相邻位置的数量。这构建sortedArray
并取O(n)。
countingArray = [0, 0, 1, 1, 2, ..., 0, 0, 0, 0]
// After skipping the first 2 0s and seeing a count of 1 in position 2
sortedArray = [2, 0, 0, 0]
// After seeing a count of 1 in position 3
sortedArray = [2, 3, 0, 0]
// In position 4 we have a count of 2 so we fill 4 in 2 positions
sortedArray = [2, 3, 4, 4]
=======
总时间复杂度为O(n)* 2 = O(n)