Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “更改两次”;至于;“单循环”;至于;循环(排序)_C++_Algorithm_Sorting - Fatal编程技术网

C++ “更改两次”;至于;“单循环”;至于;循环(排序)

C++ “更改两次”;至于;“单循环”;至于;循环(排序),c++,algorithm,sorting,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[

这是我在这里的第一篇文章。我必须对返回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]);
           }
       }    
} 
真VAULE必须位于数组的第一位,假VAL必须位于右侧(放在左侧)。我必须去掉那个内环。谢谢你的帮助和建议。我不能创建任何新的数组,必须使用循环中的一个数组(arr[])


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

问题是,在该内部循环中,您从0开始,即使您知道[0,i]中的所有元素都为false。所以我认为你可以做到这一点:

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;
}
inti=0;
int j=尺寸-1;
而(ii){
j-=1;
}
掉期(arr[i],arr[j]);
}
i+=1;
}

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

您要寻找的算法是
std::partition()
。它使用两个位置:一个从前到后移动,另一个从后到前移动,直到它们相遇。你会发现下一个位置两端的元素位置错误,并将其交换。如果你想这样看,它使用三个环(一个外环和两个内环)但它很快。事实上,上面的错误。我认为您需要的或多或少是std:partition所做的。更新了代码以显示这一点(因为它实际工作)。
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;
}