【问题标题】:Code doesn't show any error but output doesn't change insertion sorting代码没有显示任何错误,但输出不会改变插入排序
【发布时间】:2021-09-24 08:44:07
【问题描述】:

如果我输入 3 个数字 9 6 3 输出将是 6 6

我正在尝试编写一个代码,它不会显示任何错误但输出更改不会改变

#include<iostream>
using namespace std;

int main () {
    int n;
    cin>>n;

    int arr[n];
    for(int i=1;i<n;i++){
        cin>>arr[i];
    }
    
    for(int i=1;i<n;i++){
        int current = arr[i];
        int j=i-1;
        while(arr[j]>current && j>=0){
            arr[j+1]=arr[i];
            j--;
        }
        arr[j+1]= current;
    }
    
    for(int i=1;i<n;i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    
}

【问题讨论】:

  • 你知道调试器是什么吗?此外,如果您的代码没有显示任何错误并不意味着您的代码按预期工作
  • arr[0] 未初始化且未填充。这是故意的吗?
  • arr[j+1]=arr[i]; 看起来不对。

标签: c++ insertion-sort


【解决方案1】:

在获取输入和输出时,您对 arr 的迭代次数比 n 少一次。在您的代码中,即使为 n 提供值 3,然后将 9、6、3 作为 3 个数字,arr 在索引 1、2 中仅填充 9 和 6。索引 0 包含垃圾。这应该如下所示 -

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

输出循环需要相同的更改。

至于排序部分,在您的代码中,之前的索引(i-1、i-2、...等)都被arr[i] 的值覆盖,直到while 循环退出。根据索引 0 中的垃圾值,您可能会得到不同的结果。 正确的代码看起来像 -

for(int i = 1; i < n; i++){
    int current = arr[i];
    int j = i - 1;
    while(arr[j] > current && j >= 0) {
        arr[j+1] = arr[j]; // Notice the difference. Its arr[j] not arr[i] on right side
        j--;
    }
    arr[j+1] = current;
}

正如cmets中提到的@Tiger4Hire,使用std::vector而不是VLA会更好。

【讨论】:

  • 输出循环也跳过0。还有“int arr[n];”不是标准的 C++(但在 C 中可以)。对于标准 C++,使用 std::vector arr; arr.resize(n);
  • @Tiger4Hire,我已经提到了输出部分。至于矢量的用法,我同意你的看法
  • 您的回答回答了关键问题 - 误解数组索引和循环中的错误。我为您的回答 +1,因为感觉您为表达不佳的问题提供了很好的建议。我的评论并不意味着批评,对这个问题的三票反对对我来说似乎不公平。这是一个初学者的问题,但是所有人都应该可以访问堆栈溢出。因此,您应该为措辞不佳的问题提供好的建议而受到赞誉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2013-08-08
  • 2021-09-22
相关资源
最近更新 更多