【问题标题】:Why does this selection sort code shows different output when running again as compared to first time为什么与第一次相比,再次运行时此选择排序代码显示不同的输出
【发布时间】:2021-08-23 09:27:22
【问题描述】:

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

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

【问题讨论】:

  • min = arr[i];之后添加loc=i;
  • 更好的是,首先不要将值保存在min 中。该 var 是不必要的。这是可行的,只记住潜在客户最小值的位置,最初在内循环之前设置为i,然后用作交换源内循环之后而不是在内部循环内。
  • @IłyaBursov 仍然无法正常工作

标签: c++ g++ selection-sort


【解决方案1】:

抛开可变长度数组不是标准 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)应该是循环的当前索引(在本例中为i

所以……

  1. 我们不需要min。这是没有意义的。
  2. 我们必须在进入内部循环之前将loc 初始化为i
  3. 我们在内循环之后进行交换,然后仅当 loc 不再是 i 时。

结果如下所示。

int main()
{
    int n;
    cin >> n;
    int arr[n];
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }

    for (int i = 0; i < n - 1; i++)
    {
        int loc = i;
        for (int j = i + 1; j < n; j++)
        {
            if (arr[loc] > arr[j])
                loc = j; // update location to new most-extreme value
        }

        // only need to swap if the location is no longer same as i
        if (loc != i)
            swap(arr[loc], arr[i]);
    }
    
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
}

【讨论】:

    【解决方案2】:

    swap(arr[loc],arr[i]); 行应该在内部 for 循环之外,所以将它向下移动一行。 此外,您还需要在外部 for 循环的开头将 loc 初始化为 i

    【讨论】:

    • 可以和我分享编辑过的代码,因为它不像你说的那样工作
    • 我已经接受了工作正常的答案
    【解决方案3】:
    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-27
      • 2020-01-08
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多