按照元素数量级的时间复杂度对算法进行排序

时间:2017-08-22 02:29:58

标签: algorithm sorting time-complexity

我正在寻找一种O(n)排序算法,其中n是要排序的元素数。我知道高度优化的排序算法是O(n log n)但我被告知在以下条件下我们可以做得更好。条件是:

  • 我们在足够小的范围内对数字进行排序,例如0到100。

1 个答案:

答案 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)