将"for"循环更改为单个"for"循环(排序)

Changing twice "for" loop for single "for" loop (SORTING)

本文关键字:for 循环 排序 单个      更新时间:2023-10-16

这是我在这里的第一篇文章。我必须对返回 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 必须在数组中排在第一位,而假 vals 必须在右侧(左边的位置)。我必须摆脱这个内部循环。感谢您的帮助和建议。我不能制作任何新数组,这必须用循环数组 (arr[]) 来完成。

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

问题是,在那个内部循环中,即使你知道 [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)。