java冒泡排序

来源:百度知道 编辑:UC知道 时间:2024/05/23 15:29:22
刚学JAVA。还请高手帮我看看问题出在哪。?

class no3
{
public static void main(String[] args)
{

int[] a={10,20,11,5,45,12};

for (int i=1;i<a.length ;i++ )

{boolean havechange=false;

for (int j=0;j<a.length ;j++ )

{if (a[j]>a[j+1])
{havechange=true;
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
if (havechange==false )
{
break;
}
}
for (int i=0;i<a.length ; i++)
{
System.out.println(a[i]+" ");
}

}
}

其实3楼的回答已经说到重点了,但问题不在于你的if条件里
你这个题的错误在于你排序的内层循环的终止条件有问题
不应该是j<a.length因为这个会得到你数组的长度,而你内层循环做的是对每次比较进行循环,也就是说外层循环是控制一共几个数参与冒泡,而内层则是控制每个数字要跟其他的几个去比较,就好比5个人比身高其中一个要跟几个比?是不是4个呢,他不用跟自己比,因此这个语句需要写成j<a.length-1,那这个时候已经可以正常执行了,但是还不是最好的答案,因为大家都知道冒泡排序是从底下开始将要排序的数据一个个的弄到最上面,那这个过程中外循环执行一次,就会有一个数据在内层循环的工作下,经过比对成功的到顶,那这个数据已经和所有的数据进行过比对了,他已经是最大或者最小的了,后后面的数据再进行比较的时候已经没必要再去跟它比较了,再比虽然不会错,但是会额外的消耗一些性能做一些没意义的事情了。解决方案是修改内循环的结束条件为j<a.length-1-i
为什么减i呢,i是控制每个数字去循环比对的循环中的变量,每比出来一个,它会自加一次,也就是说i是几就代表已经排好几个了,这已经排好的几个,我们已经不需要再去做比较了,因此我们将它们减掉。
另外现在在JAVA里面已经不需要自己手写冒泡排序了,使用util包的Arrays类的sort方法就可以进行排序了,不过还是很认同你的学习精神的,毕竟冒泡排序在其他的语言中还是有用的呵呵。

for (int j=0;j<a.length ;j++ )

{if (a[j]>a[j+1])
{havechange=true;
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}

这段有问题的是if (a[j]>a[j+1]) 当循环到 j=4的时候 j+1就是5 超出数组的上限(a[0]--a[4]) 所以回抛出Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException 数组长度异常
而且你这个方法本身就有问题正确的应