【发布时间】:2015-11-10 06:15:20
【问题描述】:
我有一个包含 N 个元素的数组,其中仅包含两个不同的键,true 和 false。我正在尝试编写一个 O(N) 算法来重新排列列表,以便所有虚假元素都在真实元素之前。该算法的一个具体要求是我只能遍历数组一次(这意味着我不能对数组进行两次遍历;一次计算真/假的数量,另一次将值分配给数组)。我也不允许创建外部临时数组。
最初我想使用计数排序,但意识到我不能这样做,因为这个赋值的要求是我不能创建一个外部/临时数组。
然后,由于只有两个可能的值,我想遍历一次并计算它们。然后第二次迭代并设置排序(进行排序)。但是,我也不能这样做,因为我只能进行一次迭代。
所以我自己尝试实现一种算法,该算法将只在数组中迭代一次并同时进行排序。到目前为止我想出的如下(这只是一个或多或少写成伪代码的想法)
array = T T T T F F F F
int len = length of array.
counter = 0
For item in array
counter += 1
If counter <= len/2
if T change to F
else
if F change to T
当我完成这个时,我意识到这只有在所有 T 值都在数组的一侧,而所有 F 值都在另一侧时才有效。
我的问题是,谁能告诉我,我可以使用哪种 O(n) 排序算法对数组中的每个项目进行排序并排列它,以使所有虚假元素都在真实元素之前?
【问题讨论】:
-
如果你从前面和后面同时迭代,在中间相遇时停止,这算作两次迭代吗?
-
不,这不算作两次迭代。
-
原本我想使用计数排序,但意识到我不能这样做,因为这个赋值的要求是我不能创建一个额外/临时数组。