本人菜鸟,询问一个关于冒泡排序问题
看了孙卫琴的《java面向对象编程》书当中有一个关于冒泡的排序问题。我开始不理解为何要在内层循环内写int j=0;j <array.length-i-1;j++)
全部代码如下:
public class Arraysort{
public static void popsort(int [] array){
for(int i=0;i <array.length-1;i++){
for(int j=0;j <array.length-i-1;j++){
if(array[j] > array[j +1]){
int temp;
temp=array[j];
array[j]=array[j +1];
array[j +1]=temp;
}
}
printcount(i+1,array);
}
}
public static void printcount(int time,int [] array){
System.out.println( "This is the "+ time + " sort: ");
for(int i=0;i <array.length;i++)
System.out.println(array[i]);
}
public static void main(String args[]){
int [] array={4,7,5,3,9,0};
popsort(array);
}
}
并且以上代码我将那个-i去掉后出现的结果排序是一样的。也就是改为
(int j=0;j <array.length-1;j++)当然是重新编译后的结果
麻烦给解释一下好么谢谢
------解决方案--------------------其实每排完一次后.最后边的那一个结果我们是不需要去判断的,就算判断结果也是一样.比如说第一次把最大的排到后边了,那第二次你比较的时候它还不是在最后?第一次要和后边的n-1个比较,第二次的时候就只需要跟后边的n-2个比较了.这样就可以发现问题了.你比较也一样,不比如也可以.
5个数字,排完第一个后,只需要排前面的4个了(5-1)---> 0到3
然后0到2...这样
------解决方案--------------------去掉也可以的啊
关键是效率
原文的循环体执行了(array.length -1)*(array.length -1) / 2 次
如果去掉的话就要执行(array.length -1)*(array.length -1)次,多了一倍。
多出的次数主要是执行比较语句。
一句话,效率而已!