虽然循环在插入排序中工作得很好,但 For 循环没有按预期代替 while 循环工作

While loop working perfectly in Insertion sort, but For loop is not working as expected in place of while loop

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

注意:它不会抛出编译错误,只是在使用 for 循环时给出错误的答案。我已经在不同的 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(  ; j >= 0 && arr[j] > element; j--)
{
    arr[j + 1] = arr[j];
}

循环是用不同的逻辑中断条件编写的。看看 :

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

j 低于 0 arr[j] 低于 element 时,此循环将中断。因此,如果您遇到第一个 element 等于 to/higher 而不是 arr[j],则循环将中断。

现在让我们看看 for 循环:

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
    }
}

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

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];
    }