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

Why didn't my alternative sorting algorithm work?

本文关键字:算法 不起作用 排序 我的 为什么      更新时间:2023-10-16

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

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

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

我预计数字将按升序打印,但什么也没发生。还告诉我如何一次打印一个数组。 谢谢

您的排序算法不起作用,因为它只执行气泡排序或插入排序变体的一次传递。必须再缠绕一个循环才能重复操作 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开始,交换xy来制作yxz。但是在循环的下一次迭代中,我们比较了xz,忘记了y;X在数组中向前移动,向下推y。 为什么这是一个问题?因为yz没有被比较;而这两个不一定是按顺序排列的!

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

有一系列算法通过重复扫描数组和交换项目来工作。我建议研究这个系列中的以下常见算法:插入排序、选择排序和 Shell 排序。还要看看气泡排序,以便理解为什么与它密切相关的插入或选择排序相比,它是一个糟糕的算法。

  1. 你的循环条件不正确 - 最后一次迭代将比较 arr[5] 和 arr[6],这给出了索引的界限。

  2. 只有交换时,你才会更新迭代器"i",所以如果你的循环遇到arr[i] <= arr[i+1]的情况,你的迭代器将永远不会更新,你的程序将无限运行。

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