我试图实现鸡尾酒排序,在主循环中我尝试使用for循环而不是一段时间,但它并没有给我相同的结果。 这是while循环的代码:
template<typename T>
void cocktail(std::vector<T>& vec)
{
std::size_t beg = 1;
std::size_t end = vec.size()-1;
bool change = true;
while((beg < end) && (change))
//for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change); change = false)
{
change = false;
for(std::size_t j = beg; j <= end; j++){
if(vec[j] < vec[j-1]){
std::swap(vec[j-1], vec[j]);
change = true;
}
}
end--;
for(std::size_t j = end; j >= beg; j--){
if(vec[j] < vec[j-1]){
std::swap(vec[j-1], vec[j]);
change = true;
}
}
beg++;
}
}
输出:
Before: 3 2 0 9 5 7 8 1 4 6
After: 0 1 2 3 4 5 6 7 8 9
这是for循环:
template<typename T>
void cocktail(std::vector<T>& vec)
{
//std::size_t beg = 1;
//std::size_t end = vec.size()-1;
bool change = true;
//while((beg < end) && (change))
for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change); change = false)
{
//change = false;
for(std::size_t j = beg; j <= end; j++){
if(vec[j] < vec[j-1]){
std::swap(vec[j-1], vec[j]);
change = true;
}
}
end--;
for(std::size_t j = end; j >= beg; j--){
if(vec[j] < vec[j-1]){
std::swap(vec[j-1], vec[j]);
change = true;
}
}
beg++;
}
}
输出:
Before: 3 2 0 9 5 7 8 1 4 6
After: 0 2 1 3 5 7 8 4 6 9
你知道我为什么得到不同的输出吗?如果您想查看主文件或其他内容,我的代码位于here。
答案 0 :(得分:2)
在 For 循环中,从 for()语句中删除(更改= false)。让 for 语句为
for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change);)
{
// Write here
change= false;
......
}
它会起作用。
说明:在 while 循环代码中,您的更改在第一步设置为false。 但是在 for 循环中, change = false 语句在循环结束时设置为false。作为循环的最后一个语句执行的for循环的第三个参数。
考虑一个例子:
for(i = 0; i&lt; n; i ++)
i 最后不是第一次增加。这是您的解决方案的问题。
答案 1 :(得分:0)
在for
循环中,在评估条件(第2部分)之前执行“增量”(第3部分)。在你的情况下
for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change); change = false)
您没有增加变量,而是设置change = false;
。但是,在评估条件之前仍会执行此操作。因此,条件总是错误的。在您的while
循环中,您将在循环中设置change = false;
,在评估条件后。这意味着你的2个循环不等同。
答案 2 :(得分:0)
for (size_t i = 0; i < 10; i++)
body();
相当于
size_t i = 0;
while (i < 10) {
body();
}
您的代码使用
for (bool change = true; change; change = false)
body();
相当于
bool change = true;
while (change) {
body();
change = false;
}
在第一次通过此循环后,在循环开始的条件测试期间,更改将始终为false。
for ( initial ; condition ; iterate )
^-------------------v