我试图实现排序代码,所以我完全尝试了一些事情,而没有查看任何其他参考代码或任何内容。请告诉我为什么我的代码不显示任何输出?它只运行了一段时间,然后突然停止。
我想知道我要去哪里。我想将任何数组作为输入并按升序对数字进行排序。所以我只是迭代数组的吞吐量,比较相邻的元素并交换它们。然后,我尝试使用它们的索引打印数字,但屏幕上什么都没打印。
#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;
}
我希望数字会以升序打印,但是什么也没发生。并告诉我如何一次打印一个数组。 谢谢
答案 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 sort,selection sort和Shell排序。还请查看冒泡排序,以了解为什么与相近的插入或选择排序相比,它是一种较差的算法。
答案 1 :(得分:0)
您的循环条件不正确-最后一次迭代将比较arr [5]和arr [6],这将使索引超出范围。
仅当交换时才更新迭代器“ i”,因此,如果循环遇到arr [i] <= arr [i + 1]的情况,则迭代器将永远不会更新,并且程序将运行无限地。
您的算法仅实现了冒泡排序的第一个迭代,即它(从左到右)冒泡了最大的数目并停止。所以最终数组看起来像[1,2,23,4,12,32]