我将开始新的问题。我昨天提出了这个问题,想知道我的程序中有什么问题。下面给出了该程序,你们人们指出,以下程序只进行一次排序,并且还需要一个外部循环。那时我很好,好。但是当我查看程序时,我感到困惑,需要问为什么我们需要外部循环以及排序,因为只有一个循环可以进行排序(在我看来)。首先看下面的程序然后我在程序结束时提出我的逻辑。
#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();
}
我认为带有气泡条件的ONLY循环应该进行排序。查看以下程序循环:
for (i=0;i<9;i++)
if(number[i]>number[i+1])
{
temp=number[i+1];
number[i+1]=number[i];
number[i]=temp;
}
现在我解释一下我在想这个循环“应该”做什么。它首先将数字[0]与数字[1]进行比较。如果条件满足,它将执行IF语句的正文。然后我将增加1(i ++)。然后在下一次迭代中,比较的值将是数字[1]和数字[2]。那么为什么它不会发生并且循环仅在通过后退出?换句话说,可能是我试图要求IF语句不会在for循环中重复?在我看来它确实如此。我非常感谢你的帮助和意见,我的问题可能很小,但这就是我的进展。
答案 0 :(得分:14)
让我举个例子,我们只拿3个号码。所以你输入
13, 3 ,1
现在你开始对你的表现进行排序。所以比较13和3
13 > 3
所以切换它们。
现在我们有了。
3, 13, 1
现在它会比较你所说的下一对= 13和1
13 > 1
所以新订单将是
3, 1, 13
现在你的循环已经完成,你错过了比较3和1 实际上第一个循环只排序最多的数字!
答案 1 :(得分:11)
因为只有一个循环可以进行排序(在我看来)
这不正确。没有详细说明,循环的常数不足以排序,因为排序是Omega(nlogn)
问题。意思是,对于任何算法 1,2 ,O(1)
(常数,包括1)个循环数量是不够的。
考虑输入
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]
,它没有排序。
在一个冒泡排序循环之后,您只能保证最后一个元素(在示例中确实会发生)。第二次迭代将确保最后两个元素到位,n
次迭代将确保数组确实已排序,从而产生n
循环,这是通过嵌套循环实现的。 / p>
(1)外部循环有时被隐藏为递归调用(quick sort是它发生的一个例子) - 但仍然存在循环。
(2)Comparisons based algorithms,确切地说。
答案 2 :(得分:2)
对于气泡排序,传递只是将最大的元素移动到数组的末尾。所以你需要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之后,bigts元素移动到数组的末尾
答案 3 :(得分:1)
这是不对的,因为
该算法的名称从较小元素“冒泡”的方式到列表顶部。 (Bubble sort)
因此,在第一个循环结束时,我们得到最小元素。因此,为了完整排序,我们必须保持总n次循环。 (其中n =数字的总大小)