改变两次"为"单个" for"循环(分类)

时间:2014-12-03 00:11:38

标签: c++ algorithm sorting

这是我在这里的第一篇文章。我必须对返回True或False的值进行排序。我的问题是,在两个循环中花费的时间太长但我无法将其更改为单循环。

以下是排序代码:

for (int i = 0; i < size; i++) {
    if (f(arr[i]) == true) {
       for(int j = 0; j < size; j++){
           if(f(arr[j]) == false){
               swap(arr[i],arr[j]);
           }
       }    
} 

这是功能:

bool isEven(int e) { return e%2 == 0; }

真正的vaules必须是数组中的第一个,而右侧(左边的位置)必须是false vals。我必须摆脱内循环。感谢您的帮助和建议。我不能创建任何新的数组,必须使用循环中的一个(arr [])。

例如对于数组:1,2,3,4,5,6 - &gt; 2 4 6 1 5 3。

1 个答案:

答案 0 :(得分:1)

问题在于,即使你知道[0,i]中的所有元素都是假的,你也会从0开始。所以我认为你可以这样做:

int i = 0;
int j = size - 1;
while (i < j) {
   if (f(arr[i] == true) {
       while (f[arr[j] == true && j > i) {
           j -= 1;
       }
       swap(arr[i], arr[j]);
   }
   i += 1;
}

请注意,虽然上面看起来有2个循环,但每个元素只检查一次,因此运行时为O(n),而不是原始解决方案,即O(n ^ 2)。