冒泡排序详解
思路分析
- 冒泡排序是使用频率较高的一种排序算法
- 每一次循环都将最大的数向后移动,第一次循环将最大的数移动到最后的位置,第二次循环将倒数第二大的数移动到倒数第二的位置,依次类推
- 外层循环 len - 1次,每次将最大的数向后移动
- 内层循环 len - 1 - i 次,每次比较当前数和后一个数,如果前边的数大于后边的数,则交换位置
- 循环次数 是长度 - 1是因为如果有 n 个数,即长度为 n ,则只需要进行 n - 1次循环,剩下的数不用动
- 考虑冒泡的优化:
- 即如果在某一次的循环比较过程中如果没有发生数据的交换,则说明当前数组元素已经有序,返回即可
- 使用一个标志位即可
- 源码见下
源码及分析
/**
* 编写方法实现冒泡排序
*
* @param arr 要排序的数组
* <p>
* 考虑冒泡排序的优化
* 即如果在某次比较后,如果各个元素都没有交换位置,则说明数组中的元素已经排好序
* 则结束排序
* 设置标志位,判断是否交换位置
*/
public static void bubble(int[] arr) {
//定义遍历保存数组的长度
int len = arr.length;
//定义临时变量tmp用于辅助交换
int tmp = 0;
//定义变量 flag标志位判断是否交换
boolean flag = false;
//外层循环 len - 1 次,每次将数组中剩下的较大的数向后移动
for (int i = 0; i < len - 1; i++) {
//内层循环每次比较,将较大的数向后移动
for (int j = 0; j < len - 1 - i; j++) {
//如果前边的数大于后边的数,则交换两数的位置
if (arr[j] > arr[j + 1]) {
flag = true;
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
//如果某次循环中个元素并没有交换位置,则直接结束,否则flag 仍置为false
if (!flag) {
return;
} else {
flag = false;
}
}
}