虽然循环在插入排序中工作得很好,但 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];
}
我尝试使用 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];
}