arrays - 如何在线性时间内对二进制数组进行排序?

标签 arrays algorithm sorting binary time-complexity

<分区>

http://www.techiedelight.com/sort-binary-array-linear-time/

线性时间是指我们只需要遍历一次数组,但是按照这里的解法,我们会先遍历数组找出零的个数,然后再遍历一次,把数组的第一部分填满带零,其余部分带一。

那么,线性时间解决方案如何? 我错过了什么?

最佳答案

时间复杂度线性时间表示为O(n)。这意味着运行时间相对于输入的大小线性增加。对数组的所有元素求和的示例,与数组的长度成正比。

具体针对您的示例,查看 Sort() 中的循环:

int zeros = 0;
for (int i = 0; i < n; i++)
    if (A[i] == 0)
        zeros++;

此循环线性遍历 A[],并对零的数量求和。线性时间也适用于这些循环:

int k = 0;
while (zeros--)
    A[k++] = 0;

// fill all remaining elements by 1
while (k < n)
    A[k++] = 1;

因为您只是遍历 A[] 一次。

这些操作加起来是 O(2n),因为数组被遍历了两次。因此函数Sort() 是一个O(2 * n) 操作,等价于O(n)

这是另一个例子。如果您必须对 100 个二进制数和 10 个二进制数进行排序,哪个会花费更多时间?在这种情况下,对 100 个二进制数进行排序比对 10 个二进制数进行排序要长 10 倍。这是因为线性时间相对于输入 n 的大小线性增加。

关于arrays - 如何在线性时间内对二进制数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42188331/

相关文章:

arrays - 将两个不同数组的元素相乘

javascript - 如何从参数已存在的 GET 数组中查找数据

algorithm - 时间复杂度

python - 对多个键上的元组列表进行排序

php - mysql 从 $_POST 数组更新多行

mysql - 如何为我的网站帖子实现查看系统?

algorithm - 如果要加密的字母数发生变化,Hill Cipher key 是否会有所不同?

c - 根据文件中的键排序

performance - 对于 X 中的每个元素,在不遍历 Y 的情况下找到最大的索引

python - 替换 numpy 数组中的值时防止字符串被截断