对于家庭作业,我被要求使用使用O(1)空间和O(N)时间复杂度的方法对bool数组进行排序。可以提供任何提示吗?我正在考虑快速排序算法的枢轴方法。 -Thanks!
答案 0 :(得分:8)
答案 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);
}
}