排序二进制数组的时间复杂度

时间:2013-10-01 08:36:39

标签: c++ algorithm time-complexity

给出以下数组:| 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;
}
你能告诉我两者的时间复杂度吗?哪一个表现更好 还建议我一个更好的解释算法。感谢。

3 个答案:

答案 0 :(得分:15)

只计算1的数量,然后用第一个lengthOfArray - sum个元素再填充数组,然后用1个元素重新填充。复杂性将是O(n)。

在这两种情况下,您的复杂度为O(n²)

答案 1 :(得分:3)

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

  1. 查找0,1
  2. 的计数
  3. 用数字填充数组,数字为0.
  4. 如果您正在寻找另一种替代排序,您可以查看这是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++;}
    }
    

答案 2 :(得分:2)

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