【问题标题】:Why didn't my alternative sorting algorithm work?为什么我的替代排序算法不起作用?
【发布时间】:2020-01-04 02:03:37
【问题描述】:

我试图实现一个排序代码,所以我完全尝试了一些东西,而没有查看任何其他参考代码或任何东西。请告诉我为什么我的代码没有显示任何输出?它只是运行了一段时间,然后突然停止。

我想知道我哪里出错了。我想将任何数组作为输入,并按升序对其中的数字进行排序。所以我只是迭代了数组的吞吐量并比较了相邻的元素并交换了它们。然后我尝试使用它们的索引打印数字,但它没有在屏幕上打印任何内容。

#include <iostream>
using namespace std;
int main() {
  int arr[6]={1,23,2,32,4,12};
  int i=0;
  while(i<6)
  {
    if(arr[i]>arr[i+1])
    {
      int x = arr[i];
      arr[i]=arr[i+1];
      arr[i+1]=x;
    }
    else
      continue;
    i++;
  }
  cout<<arr[0];
  cout<<arr[1];
  cout<<arr[2];
  cout<<arr[3];
  cout<<arr[4];
  cout<<arr[5];
  return 0;
}

我希望这些数字会按升序打印,但什么也没发生。还告诉我如何一次打印一个数组。 谢谢

【问题讨论】:

    标签: c++ arrays sorting io


    【解决方案1】:

    您的排序算法不起作用,因为它只执行冒泡排序或插入排序的变体的一次。必须在循环周围再缠绕一个循环才能重复操作 N-1 次。

    有多种方法可以解释为什么需要多次通过。这是一种解释。每当我们执行此步骤时:

    if (arr[i] > arr[i+1])
    {
      int x = arr[i];
      arr[i] = arr[i+1];
      arr[i+1] = x;
    }
    

    我们将arr[i+1] 元素转移到arr[i] 位置。通过这样做,我们有效地跳过 arr[i+1] 元素。

    这就是我的意思。假设arr[i] 称为xarr[i+1] 称为yarr[i+2] 称为z。我们从xyz开始,把xy交换成yxz。但是在循环的下一次迭代中,我们比较了 xz 并且忘记了 yx 在数组中向前移动,向下推 y。为什么这是个问题?因为没有比较yz;而且这两个不一定是按顺序排列的!

    假设我们有 { 3, 2, 0 }。我们比较 3 和 2,然后交换它们,得到 { 2, 3, 0}。然后我们继续比较 3 和 0:我们交换它们并得到 { 2, 0, 3 }。看到问题了吗?我们忽略了处理 2 和 0。这需要再次遍历数组。

    有一系列算法通过重复扫描数组和交换项目来工作。我建议研究一下这个家族的常用算法:insertion sortselection sortShell排序。还要看看冒泡排序,以了解为什么它与与其密切相关的插入或选择排序相比是一种糟糕的算法。

    【讨论】:

    • 即使只进行了一轮比较,它也应该打印输出。它没有打印任何东西并运行了很长时间,然后停止而没有显示任何结果。为什么会这样?
    • @SubhadeepChatterjee 我猜这是因为continue 语句。如果arr[i] 不大于arr[i+1],那么您调用continue。这会跳过 i++ 增量,哎呀,你处于无限循环中。
    • @SubhadeepChatterjee 你可以看看我下面的回答,它解释了
    【解决方案2】:
    1. 您的循环条件不正确 - 最后一次迭代将比较 arr[5] 和 arr[6] 导致索引超出范围。

    2. 只有在交换时才更新迭代器“i”,因此如果循环遇到 arr[i]

    3. 您的算法只实现了冒泡排序的第一次迭代,即它冒泡(从左到右)最大的数字并停止。所以最终的数组看起来像 [1, 2, 23, 4, 12, 32]

    【讨论】:

    • 可以给它贴一个例子。
    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多