While循环在插入排序中工作完美,但For循环在While循环中没有按预期工作



我尝试使用for循环,但它给出了错误的答案。当我在它的位置使用while循环时,排序按预期完成。有人能帮我调试吗?

注意:它不会抛出编译错误,只是在使用for循环时给出一个错误的ans。我试过在不同的IDE上运行,甚至试过干运行for循环,但我无法理解这里的问题。

//While loop
while(j >= 0 && arr[j] > element)
{
arr[j + 1] = arr[j];
j = j - 1;
}
//For loop
for(; j >= 0; j--)
{
if(arr[j] > element)
{
arr[j + 1] = arr[j];
}
}

完整的代码,如果有人需要

#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
vector<int> sortArr(vector<int> arr, int n)
{
int i, j, element;
for(i = 1; i < n; i++)
{
element = arr[i];
j = i - 1;
while(j >= 0 && arr[j] > element)
{
arr[j + 1] = arr[j];
j = j - 1;
}
/*for(  ; j >= 0 ; j--)
{
if(arr[j] > element){
arr[j + 1] = arr[j];
}    

}*/
arr[j + 1] = element;
}
return arr;
}
};
int main()
{
vector<int> s(4);
for(int i = 0; i < 4; i++)
{
cin >> s[i];
}
Solution ob;
vector<int> v = ob.sortArr(s, 4);
for(auto i : v)
{
cout << i << ' ';
}
cout << endl;
return 0;
}

while循环和for循环不相等。对于for循环,j总是以0结束,因为没有等价的&& arr[j] > element检查。这会损坏矢量内容,因为您将覆盖索引0。

等价for循环:

for(  ; j >= 0 && arr[j] > element; j--)
{
arr[j + 1] = arr[j];
}

两者不相等,如果你看这个:

while (j >= 0 && arr[j] > element)
{
arr[j + 1] = arr[j];
j = j - 1;
}

arr[j] > element时停止。但这不是:

for(  ; j >= 0 ; j--)
{
if(arr[j] > element){
arr[j + 1] = arr[j];
}    

}

继续运行超过arr[j] > element。所以等价的是:

for(  ; j >= 0 && (arr[j] > element) ; j--)
{
arr[j + 1] = arr[j];
}

用不同的逻辑break条件编写循环。看while:

while (j >= 0 && arr[j] > element)

j低于0arr[j]低于element时,此循环中断。因此,如果遇到第一个等于/高于arr[j]element,循环将中断。

现在我们来看看的循环:

for(  ; j >= 0 ; j--)

在这种情况下,唯一的条件是值j的倒计时。但是如果您发现element等于/高于arr[j],这意味着这将不满足:

if(arr[j] > element){

循环将继续,直到j不低于0

如何修复你的代码片段是添加break指令:

for ( ; j >= 0; j--) {
if(arr[j] > element) {
arr[j + 1] = arr[j];
} else {
break; // the loop will stop, just like the while loop does
}
}