冒泡排序思路: 利用交换元素的位置进行排序,两两比较排序的元素,直到结束
冒泡比较的是相邻的两个数,把逆序的数据向后移动,
比较的次数 = 总长度 - 趟数\
我们对数组int[] array{3,1,4,2,5,6,};进行冒泡排序,进行升序排序,
第一趟比较 : 3,1,6,2,5,4
第一次比较: 1,3,6,2,5,4 比较的两个数是3和1,交换位置
第二次比较: 1,3,6,2,5,4 比较的两个数是3和6,不交换位置
第三次比较: 1,3,2,6,5,4 比较的两个数是6和2,交换位置
第四次比较: 1,3,2,5,6,4 比较的两个数是6和5,交换位置
第五次比较: 1,3,2,5,4,6 比较的两个数是6和4,交换位置
第二趟比较 : 1,3,2,5,4,6
第一次比较: 1,3,2,5,4,6 比较的两个数是1和3,不交换位置
第二次比较: 1,2,3,5,4,6 比较的两个数是2和2,交换位置
第三次比较: 1,2,3,5,4,6 比较的两个数是3和5,不交换位置
第四次比较: 1,2,3,4,5,6 比较的两个数是5和4,交换位置
不需要和6比较,上一趟已经确认了6是最大的,这一趟,又确认一个最大值:5
第三趟比较 : 1,2,3,4,5,6
第一次比较: 1,2,3,4,5,6 比较的两个数是1和2,不交换位置
第二次比较: 1,2,3,4,5,6 比较的两个数是2和3,不交换位置
第三次比较: 1,2,3,4,5,6 比较的两个数是3和4,不交换位置
不需要比较4和5的关系,上一趟确认了最大值的就是4
第四趟比较 : 1,2,3,4,5,6
第一次比较: 1,2,3,4,5,6 比较的两个数是1和2,不交换位置
第二次比较: 1,2,3,4,5,6 比较的两个数是2和3,不交换位置
不需要比较3和4的关系,上一趟确认了最大值的就是4,本轮确定的最大值就是3
第五趟比较
第一次比较: 1,2,3,4,5,6 比较的两个数是1和2,不交换位置
不需要了 已经排好了,因为这一趟确定要给最大值是2,那剩余的1就一定是最小的
以此类推
在我们了解了冒泡,发现第三趟之后 ,每趟的比较基本没有改变数据,那下一趟是可以取消的 因为冒泡的规则 固定为n-1趟,导致代码依然执行了剩下的几趟循环.
因此我们可以通过布尔值来控制
public static void main(String[] args) {
int[] array = {3,1,6,2,5,4};
System.out.println("排序前:\t" + Arrays.toString(array));
//-- 比较n-1次
for (int i = 0; i < array.length - 1; i++) {
boolean flag = false;
/*
* -i 让每一趟 少比较一个数
* -1 避免越界 array[j + 1] j 的取值 是< array.length 假设length为10 那j可以取到9 但是一旦执行了j + 1则可以取到10
* 会产生越界!!
*/
for (int j = 0; j < array.length -1 - i; j++) {
//-- 大于和小于 决定了 排序的方向是向前还是向后
//-- 两数交换,当前数和后数交换
if (array[j] < array[j+1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j+1] = temp;
flag = true;
}
}
//-- 当前趟 交换一次都没有发生,那下一趟可以不用比较了!
if(!flag){
break;
}
}
System.out.println("排序后:\t" + Arrays.toString(array));
}
}
当然Boolean也可以不加,只是为了让这段代码优化而已
下面是不加的代码
public static void main(String[] args) {
int[] array = {3,1,6,2,5,4};
System.out.println("排序前:\t" + Arrays.toString(array));
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length -1 - i; j++) {
if (array[j] < array[j+1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j+1] = temp;
}
}
}
System.out.println("排序后:\t" + Arrays.toString(array));
}
}