【问题标题】:Time complexity for sorting an array of binary numbers [duplicate]对二进制数数组进行排序的时间复杂度
【发布时间】:2013-10-07 08:08:18
【问题描述】:

给定以下数组:| 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |

我们必须对上面的数组进行排序,就像右边全是 1,左边全是 0。

我在 C++ 中提出了 2 种算法。

第一个:

for(i = 0; i < n; i++) {
    if(a[i] == 1 && i != n - 1) {
        for(j = i + 1; j < n; j++) {
            if(a[j] == 0) {
                temp = a[j];
                a[i] = a[j];
                a[j] = temp;
                break;
            }
        }
    }
}

第二个:

int x = 0;
for(i = 0; i < n; i++) {
    if(a[i] == 1) {
        for(j = n-x-1; j >= 0; j--) {
            if(a[j] == 0) {
                temp = a[j];
                a[i] = a[j];
                a[j] = temp;
                x++;
                break;
            }
        }
    if(x > n / 2)
    break;
}

你能告诉我两者的时间复杂度吗?哪个表现更好 还建议我一个更好的算法和解释。谢谢。

【问题讨论】:

标签: c++ algorithm time-complexity


【解决方案1】:

只需计算个数,然后先用零填充您的数组lengthOfArray - sum 元素,然后再用一个。复杂度为 O(n)。

在这两种情况下,复杂度都是 O(n²)

【讨论】:

  • 这也可以认为是基数排序。
  • @Adam 或桶排序。尽管如此,当有更直接的事情时,我不认为应该使用排序算法来解决这个问题。
  • 更类似于counting sort
【解决方案2】:

正如@Alexandru 所说的那样好给 O(N) ,你只需要迭代两次

  1. 求计数为 0, 1
  2. 用 1、0 填充数组,就像 count 所说的那样。

如果您正在寻找另一种替代排序,您可以查看 O(N)。

for(int i=0, j=n-1;i<j;)
{
if(a[i]==1 && a[j]==0) swap(a[i],a[j]);
else if(a[i]==1 && a[j]==1) j--;
else if(a[i]==0 && a[j]==0) i++;
else if(a[i]==0 && a[j]==1) {j--; i++;}
}

【讨论】:

【解决方案3】:

第一个将在 O(n^2) 时间内对数组进行排序,因为它是冒泡排序的直接含义。但是第二种方法不会对数组进行排序,因为您在从末端横向移动时将 1 与第一个 0 交换。因此,如果您的数组类似于0 0 0 1 1 1,那么第二个代码会将第三个索引中的 1 与第二个索引的 0 交换,最后它看起来像0 0 1 1 1 0。我不知道那个 x 是什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多