“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
一、题目描述
冒泡排序想必工程师都知道,我也没想过面试会问这道题,考察点是冒泡排序的优化。- 防止有小伙伴不了解还是说一下,
冒泡排序其实就是将一个无序数组,排列成从小到大的有序数组。
二、思路分析
- 从头到尾两两进行比较
- 当前元素大于右侧相邻元素时
- 进行交换
- 优化
- 设置一个
boolean标记位,每次循环设置为true,如果有交换设置false,无则在最后跳出循环 - 此时还可以进行
二次优化,设置一个无序数组的边界值,减少无用循环比较
- 设置一个
三、AC 代码:
public static void sort(int array[]){
//最后交换的位置
int lastExchangeIndex = 0;
//无序数组的边界
int sortBorder = array.length - 1;
for(int i = 0; i < array.length - 1; i++){
//此轮是否有交换
boolean isSorted = true;
//循环结束位置为无序数组的边界
for(int j = 0; j < sortBorder; j++){
//临时变量
int tmp = 0;
//右侧元素大于左侧交换并更新变量
if(array[j] > array[j + 1]){
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
isSorted = false;
lastExchangeIndex = j;
}
}
//更新无序数组边界
sortBorder = lastExchangeIndex;
//没有交换停止循环
if(isSorted){
break;
}
}
}
四、总结:
- 好了,代码撸完,我们
总结一下:-
定义
是否交换,可以提前结束循环 -
定义
无序边界,可以减少循环次数 -
数字交换的代码常用必会
-