冒泡排序是一种简单直接的排序算法。它依次对比两个相邻的元素,如果顺序错误就交换他们的值,然后重复这个过程,直到没有需要交换的的元素,即排序完成。
Java实现
Integer[] arr = new Integer[]{43, 77, 29, 39, 66, 83, 104, 93, 11, 10, 18, 27};
for (int i = 1; i < arr.length; i++) {
// 每一次内循环都可以找出一个最大值,如arr数组,第一次内循环找出最大值104
// 第二次内循环找出最大值93。。。。第11次内循环找出最大值11,剩下最后一个元素10就是最小值,不需要在做比较
// 所以总共要执行length-1次内循环做对比,即i的初始值是1
boolean flag = false;// 定义一个代表内循环是否进行过交换的标识
for (int j = 0; j < arr.length - i; j++) {
// 数组总长度是length,内循环是前后两个元素依次对比,第1次循环时,内循环需要对比length-1次,所以i初始值是1
// 第1次内循环结束后,能找出1个最大值,所以第2次循环可以少对比2次,即length-2次
// 由此可推导出,第i次外循环时,内循环需要对比length-i次,即length-i
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
if (!flag) {
// 如果某一次内循环对比结束后,没有进行过交换,说明数组已经排好顺序了
break;
}
}
for (Integer integer : arr) {
System.out.println(integer + "");
}
}
输出结果: 10 11 18 27 29 39 43 66 77 83 93 104
算法步骤
- 比较两个相邻的元素,如果第一个比第二个大,就交换他们的值。即内循环内部实现的逻辑
- 对比每一对相邻的元素做步骤1的操作,直到最后一对元素。执行完之后会找出最大的元素。即整个内循环的逻辑
- 将步骤1、2的操作重复执行,直到没有需要对比的元素。即整个外循环的逻辑