int i = 0, j = A.size() - 1;
while (i < j) {
while ((i < j) && (A[i] % 2 == 0)) ++ i;
while ((i < j) && (A[j] % 2 == 1)) -- j;
swap(A[i], A[j]);
i ++;
j --;
我们可以从阵列的两端进行扫描,如果不在适当的位置,可以交换它们。为什么时间复杂度为O(N)而不是O(N * N)?
答案 0 :(得分:1)
您可以重写代码以使其更清晰:
int i = 0, j = A.size() - 1;
while (i < j) {
if (A[i] % 2 == 0) ++ i;
else if (A[j] % 2 == 1) -- j;
else {
swap(A[i], A[j]);
i++;
j--;
}
}
答案 1 :(得分:0)
该算法的复杂度为O(N),因为在任何情况下,运算次数将仅为j-i倍。
这里,外循环的任何迭代的内循环将执行j-i次。