关于冒泡排序的小优化
今天在看代码的时候,看到一段之前老同事写的冒泡排序代码;发现在内层for排序交换位置的时候,通过增加标识符flag=true/false;可以提前在完成排序的时候,终止循环,避免不必要的排序浪费。记录下来,不是为了说这点小东西还大张旗鼓的写一个小文章,希望自己在这里能学到所谓优化就是精益求精。
点击查看代码
public static void main(String[] args) {
int [] array = {1,2,4,3,4,6,4,9,34,22,4};
//用于优化循环次数,当十个元素,正常需要冒泡九次,但是如果数组在冒泡第五次的时候顺序就已经是从小到大排序好了,后面的循环就多余了
boolean flag = true;
//相邻元素交换,存储交换值
int val = 0;
//记录交换次数
int count = 0;
for(int i=0;i<array.length-1; i++) {
//-i-i: 每冒泡一次,都会确定一次最大的元素,放在最后一位,所以每次内循环就可以减少一次循环次数
for(int j=0;j<array.length-1-i;j++) {
flag = false;
if(array[j]>array[j+1]) { //冒泡
val = array[j];
array[j] = array[j+1];
array[j+1] = val;
flag = true; //记录是否交换元素,如果没有交换,则退出循环
}
}
if(flag==false) {
System.out.println("排序结束");
break;
}
count++;
//輸出每次排序結果
System.out.println(Arrays.toString(array));
}
System.out.println(Arrays.toString(array));
System.out.println("冒泡次数:"+count);
}
浙公网安备 33010602011771号