为什么我的替代排序算法不起作用?

时间:2019-08-30 20:58:54

标签: c++ arrays sorting io

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

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

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

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

2 个答案:

答案 0 :(得分: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]被称为 x arr[i+1]被称为 y arr[i+2]被称为 z 。我们从 xyz 开始,并交换 x y 来制作 yxz 。但是,在循环的下一个迭代中,我们比较了 x z ,而忘记了 y x 在数组中向前移动,按下了 y 。为什么会有问题呢?因为尚未比较 y z ;而且这两个不一定按顺序排列!

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

有一系列算法可通过重复扫描数组并交换项目来工作。我建议研究以下该家族中的常见算法:insertion sortselection sortShell排序。还请查看冒泡排序,以了解为什么与相近的插入或选择排序相比,它是一种较差的算法。

答案 1 :(得分:0)

  1. 您的循环条件不正确-最后一次迭代将比较arr [5]和arr [6],这将使索引超出范围。

  2. 仅当交换时才更新迭代器“ i”,因此,如果循环遇到arr [i] <= arr [i + 1]的情况,则迭代器将永远不会更新,并且程序将运行无限地。

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