排序布尔值,O(N)时间,O(1)空间

时间:2013-12-01 00:26:35

标签: algorithm sorting boolean

对于家庭作业,我被要求使用使用O(1)空间和O(N)时间复杂度的方法对bool数组进行排序。可以提供任何提示吗?我正在考虑快速排序算法的枢轴方法。 -Thanks!

3 个答案:

答案 0 :(得分:8)

  1. 保持正面和背面的索引。
  2. 检查当前的前面索引,如果它的前面索引为假增量
  3. 如果它与后退索引真正交换并减少后退索引
  4. 继续步骤2和3,直到前后指数彼此相等

答案 1 :(得分:5)

如果你有一组布尔值,你可以简单地计算 true (或 false )值。让我们假设这个结果是 k 。然后将数组的第一个 k 元素设置为 true ,剩余的 false

此算法遍历数组两次(因此它具有 O(N)时间复杂度),并且仅使用一个计数器,因此所需空间为 O(1)

答案 2 :(得分:2)

由于布尔值只有两个可能的值,你可以只计算“true”和“false”,然后就地修改原始数组,这样你首先要放入适当数量的false值。它,然后用true填充其余部分。根据需要,时间为O(n),空间为O(1)。 C代码如下:

void sortbool(int *b, size_t n)
{
    size_t k = 0;
    for (size_t i = 0; i < n; i++) {
            if (!b[i])
                    k++;
    }

    for (size_t i = 0; i < n; i++) {
            b[i] = !(i < k);
    }
}