这是我在这里的第一篇文章。我必须对返回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。
答案 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)。