我的老师告诉我,这是冒泡排序的唯一代码
int a[]={2,3,7,9,8,1,4,5,10,6};
for(int i=0;i<a.length;i++)
{
for(int j=0;j<a.length-i-1;j++)
{
if(a[j]>a[j+1])
{
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+"\t");
}
但我用不同的外循环运行程序 -
int b[]={2,3,7,9,8,1,4,5,10,6};
for(int i=0;i<b.length-1;i++)
{
for(int j=0;j<b.length-i-1;j++)
{
if(b[j]>b[j+1])
{
int t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}
for(int i=0;i<b.length;i++)
{
System.out.print(b[i]+"\t");
}
输出是 - 第一案 -
1 2 3 4 5 6 7 8 9 10
第二案 -
1 2 3 4 5 6 7 8 9 10
所以现在我被告知我的代码错了,即使我的输出正确。 请告诉我,我完全错了吗?
答案 0 :(得分:4)
两个版本都会正确排序。然而,第一个版本将总是执行额外的(不必要的)传递,因为它执行N次传递,而如果考虑它,元素可能更改位置的最大次数是N-1(将是最小/最大数字时)是在数组的错误一端。)
因此第二版更有效,它将复杂度从大约O(N * N)降低到O(N *(N-1))。这基本上是一样的。
因此,您的老师应识别您的代码是否正确。由于教师经常被困在他们的思维模式中,所以当你和他交谈时要对他们进行外交,并小心地让他得出结论,N-1外传就足够了。
答案 1 :(得分:2)
答案 2 :(得分:0)
您的外部循环不会遍历所有元素。查看b.length-1 for(int i=0;i<b.length-1;i++)
。这意味着,如果你有10个元素,你将迭代到第8个元素。由于您同时使用<
和length-1
。如果你想坚持使用.length-1
。您应该将条件更改为i<=b.length-1
。