如何解决为什么与第一次相比,此选择排序代码在再次运行时显示不同的输出
首先,当我编写此程序的代码时,它运行良好,但再次运行时,它没有显示预期的输出,有人可以告诉它有什么问题
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
int arr[n];
int loc,min;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
for (int i = 0; i < n - 1;i++){
min = arr[i];
for (int j = i + 1; j < n; j++)
{
if(min>arr[j]){
min = arr[j];
loc = j;
}
swap(arr[loc],arr[i]);
}
}
for (int i = 0; i < n; i++){
cout << arr[i] << " ";
}
cout << endl;
}
解决方法
行 swap(arr[loc],arr[i]);
应该在内部 for 循环之外,因此将其向下移动一行。
此外,您还需要在外部 for 循环开始时将 loc
初始化为 i
。
抛开可变长度数组不是标准 C++ 的一部分这一事实(因此应该烧掉使用它们的代码教程),代码有两个主要问题。
-
在一个已经排序的序列上,最里面的
if
主体永远不会被输入,因此loc
永远不会收到一个确定的值。 -
交换位置不对..
说明
在您的代码中...
using namespace std;
int main(){
int n;
cin >> n;
int arr[n];
int loc,min; // loc is INDETERMINATE HERE
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
for (int i = 0; i < n - 1;i++){
min = arr[i];
for (int j = i + 1; j < n; j++)
{
if(min>arr[j]){
min = arr[j];
loc = j; // loc ONLY EVER SET HERE
}
swap(arr[loc],arr[i]); // loc IS USED HERE EVEN IF NEVER SET
}
}
for (int i = 0; i < n; i++){
cout << arr[i] << " ";
}
cout << endl;
}
内循环的目的是在剩余序列中找到最极端值(最小、最大,无论您使用什么用于您的订单标准)的位置 (loc)。在内循环中不应发生交换,初始极值位置(同样,loc
)应该是外循环的当前索引(在本例中为 {{1} })
因此...
- 我们不需要
i
。毫无意义。 - 在进入内循环之前,我们必须将
min
初始化为loc
。 - 我们在内循环之后交换,然后仅当
i
不再是loc
。
结果看起来像这样。
i
,
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
int arr[n];
int loc,min;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
for (int i = 0; i < n - 1;i++){
min = arr[i];
loc=i;
for (int j = i + 1; j < n; j++)
{
if(min>arr[j]){
min = arr[j];
loc = j;
}
swap(arr[i],arr[loc]);
}
}
for (int i = 0; i < n; i++){
cout << arr[i] << " ";
}
cout << endl;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。