冒泡排序法基本原理(递增排序):分两层循环,一层外循环,一层内循环。相邻两个元素相互比较,若前面的数大于后面一个的数,则交换位置,否则不变。
将整个数列分成有序数列和无序数列两部分会比较好理解。
刚开始时,整个数列是无序的,有序数列时空的。
外循环循环一次,无序数列中的最大的数排到了最后(有序数列的元素个数增加1),那么不需要再去顾及这个有序数列,我们可以通过“标记”的方式判断有序数列还是无序数列,在循环过程中有发生元素交换则是无序,没有发生交换则是有序,当整个数列都是有序数列时,中断循环,可以节省步骤。
import java.util.Arrays;
public class Test{
public static void main (String[] args) {
int[] values = { 9,8,7,6,5,4,3,2,1,0};
bubbleSort(values);
System.out.println(Arrays.toString(values));
}
public static void bubbleSort(int[] b) {
int temp;
int i;
//外循环一次完毕,有序数列加1
for (i = 0; i<b.length;i++) {
//初始化“标记”,“标记”为true则是有序
boolean panDuan = true;
for(int j=0;j<b.length-1-i;j++) {
if(b[j] > b[j+1]) {
temp = b[j];
b[j] = b[j+1];
b[j+1] = temp;
panDuan = false;
}
}
//若整个数列均为有序数列,即元素均无交换位置,中断循环
if(panDuan) {
System.out.println("第"+(i+1)+"次"+panDuan+"直接退出循环");
break;
}
System.out.println("第"+(i+1)+"次循环"+panDuan);
}
}
}
运行结果:
第1次循环false
第2次循环false
第3次循环false
第4次循环false
第5次循环false
第6次循环false
第7次循环false
第8次循环false
第9次循环false
第10次true直接退出循环
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]