微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么与第一次相比,此选择排序代码在再次运行时显示不同的输出

如何解决为什么与第一次相比,此选择排序代码在再次运行时显示不同的输出

首先,当我编写此程序的代码时,它运行良好,但再次运行时,它没有显示预期的输出,有人可以告诉它有什么问题

#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++ 的一部分这一事实(因此应该烧掉使用它们的代码教程),代码有两个主要问题。

  1. 在一个已经排序的序列上,最里面的 if 主体永远不会被输入,因此 loc 永远不会收到一个确定的值。

  2. 交换位置不对..

说明

在您的代码中...

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

因此...

  1. 我们不需要i。毫无意义。
  2. 在进入内循环之前,我们必须min 初始化为 loc
  3. 我们在内循环之后交换,然后仅当 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 举报,一经查实,本站将立刻删除。