为啥冒泡排序需要嵌套循环?
Posted
技术标签:
【中文标题】为啥冒泡排序需要嵌套循环?【英文标题】:Why Bubble Sort needs nested loops?为什么冒泡排序需要嵌套循环? 【发布时间】:2012-08-28 21:14:40 【问题描述】:我要开始新的问题。我昨天提出了这个问题,想知道我的程序有什么问题。该程序在下面给出,大家指出,下面的程序只进行一次排序,并且还需要一个外循环。那个时候我就好喜欢OK。但是当我再次查看程序时,我感到困惑,需要问为什么我们还需要外循环进行排序,因为只有一个循环可以进行排序(在我看来)。先看下面的程序,然后我在程序的最后展示我的逻辑。
#include <iostream.h>
#include <conio.h>
using namespace std;
main()
int number[10];
int temp = 0;
int i = 0;
cout << "Please enter any ten numbers to sort one by one: "
<< "\n";
for (i = 0; i < 10; i++)
cin >> number[i];
i = 0;
for (i = 0; i < 9; i++)
if (number[i] > number[i + 1])
temp = number[i + 1];
number[i + 1] = number[i];
number[i] = temp;
i = 0;
cout << "The sorted numbers are given below:"
<< "\n";
for (i = 0; i < 10; i++)
cout << number[i] << "\n";
getch();
我认为带有气泡条件的唯一循环应该进行排序。看下面的程序循环:
for (i=0;i<9;i++)
if(number[i]>number[i+1])
temp=number[i+1];
number[i+1]=number[i];
number[i]=temp;
现在我解释一下我在想这个循环“应该”做什么。它将首先将 number[0] 与 number[1] 进行比较。如果满足条件,它将执行 IF 语句主体中的操作。然后 i 将增加 1(i++)。然后在下一次迭代中,比较的值将是 number[1] 和 number[2]。那为什么它没有发生并且循环仅在通过后退出?换句话说,可能是我想问 IF 语句不会在 for 循环中重复吗?在我看来确实如此。我非常感谢您的帮助和意见,我的问题可能很小,但这就是我的进步。
【问题讨论】:
这是一个非常基础的排序问题,我给你一个提示:把最小值放在最后一个位置[9]。它将被比较并移动到上一个位置 [8],然后您的循环结束。排序还没有完成。 非常简单明了的例子。谢谢 【参考方案1】:让我举个例子,我们只取 3 个数字。所以你输入
13, 3 ,1
现在你开始排序你是如何做到的。所以它比较 13 和 3
13 > 3
所以切换它们。
现在我们有了。
3, 13, 1
现在它会像你所说的那样比较下一对 = 13 和 1
13 > 1
所以新订单是
3, 1, 13
现在您的循环已完成,您错过了比较 3 和 1 实际上第一个循环只排序最大的数字!
【讨论】:
我不知道从哪里做这个,因为我是这个网站的新手。没关系,我是在查看了可以选择的选项后才这样做的。 @user1643568:作为提问者,您拥有accepting an answer 的特权。您可以通过单击其中一个答案旁边的绿色复选 (V) 符号来完成。您只能接受一个答案,并且应该是对您帮助最大的答案。 在我帖子的左侧有一个复选标记的轮廓。点击它意味着您接受此帖子为“最佳” 很难在阿米特和洛伦兹阿尔伯特的答案之间做出选择。两者都很完美,但既然 lorenz 提出了要求,所以我将他的答案标记为最佳。 Amit 的表述也清晰而全面。【参考方案2】:因为只有一个循环可以进行排序(在我看来)
这是不正确的。不深入细节,固定数量的循环不足以排序,因为排序是Omega(nlogn)
的问题。意思是,O(1)
(常数,包括 1)循环数是不够的 - 对于任何算法1,2。
考虑输入
5, 4, 3, 2, 1
一个冒泡排序循环就可以了:
4, 5, 3, 2, 1
4, 3, 5, 2, 1
4, 3, 2, 5, 1
4, 3, 2, 1, 5
所以算法最终会得到数组:[ 4, 3, 2, 1, 5]
,它没有排序。
在一个冒泡排序循环之后,您只能保证将最后一个元素放在适当的位置(在示例中确实发生了这种情况)。第二次迭代将确保最后 2 个元素就位,n
th 迭代将确保数组确实已排序,从而导致 n
循环,这是通过嵌套循环实现的。
(1) 外层循环有时被隐藏为递归调用(quick sort 是它发生的一个例子)——但仍然存在一个循环。 (2) Comparisons based algorithms,确切地说。
【讨论】:
谢谢阿米特。意味着在一个循环中,一个数字位于其正确位置。重复它 n(其中 n=要排序的项目)将对所有 n 个数字进行排序。谢谢它帮助我消除歧义。 @user1643568:没错。这就是冒泡排序所做的。这也是我们如何证明它(冒泡排序)有效的方式。很高兴能帮助您更好地了解它的工作原理。 虽然被选为最佳答案的答案也给出了正确答案,但您以更好、更详细的方式解释了它。谢谢。【参考方案3】:对于冒泡排序,传递只是将最大的元素移动到数组的末尾。所以你需要 n-1 次传递来获得一个排序的数组,这就是你需要其他循环的原因。现在对于您的代码,1 次通过意味着
if(number[0]>number[0+1])
temp=number[0+1];
number[0+1]=number[0];
number[0]=temp;
if(number[1]>number[1+1])
temp=number[1+1];
number[1+1]=number[1];
number[1]=temp;
.....6 more times
if(number[8]>number[8+1])
temp=number[8+1];
number[8+1]=number[8];
number[8]=temp;
所以你可以看到 IF 语句重复自己,只是在所有 9 个 IF 之后,largets 元素移动到数组的末尾
【讨论】:
【参考方案4】:这是不正确的,因为
算法得名于较小的元素“冒泡”到列表顶部的方式。 (Bubble sort)
所以,在第一个循环结束时,我们得到了最小的元素。因此,为了完成排序,我们必须保持 总共 n 个循环。 (其中 n = 数字的总大小)
【讨论】:
以上是关于为啥冒泡排序需要嵌套循环?的主要内容,如果未能解决你的问题,请参考以下文章