文章目录
概念
定义
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成
原理:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数
- 针对所有的元素重复以上的步骤,除了最后一个
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
动图演示:
代码示例
/**
* 冒泡排序
*
* @author liouwb
*/
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {5, 6, 3, 1, 8, 7, 2, 4};
bubbleSort(arr);
}
/**
* 冒泡排序
*
* @param arrs
*/
public static void bubbleSort(int arrs[]) {
for (int i = 0; i < arrs.length - 1; i++) {
System.out.println("第" + (i + 1) + "轮遍历");
// 遍历比较交换
for (int j = 0; j < arrs.length - 1 - i; j++) {
if (arrs[j] > arrs[j + 1]) {
// 临时变量用于数据交换
int temp = arrs[j];
arrs[j] = arrs[j + 1];
arrs[j + 1] = temp;
}
}
// 打印每一轮遍历的结果
System.out.println("第" + (i + 1) + "轮遍历结果:");
for (int arr : arrs) {
System.out.print(arr + "\t");
}
System.out.println("\n");
}
}
}
- 输出结果:
第1轮遍历
第1轮遍历结果:
5 3 1 6 7 2 4 8
第2轮遍历
第2轮遍历结果:
3 1 5 6 2 4 7 8
第3轮遍历
第3轮遍历结果:
1 3 5 2 4 6 7 8
第4轮遍历
第4轮遍历结果:
1 3 2 4 5 6 7 8
第5轮遍历
第5轮遍历结果:
1 2 3 4 5 6 7 8
第6轮遍历
第6轮遍历结果:
1 2 3 4 5 6 7 8
第7轮遍历
第7轮遍历结果:
1 2 3 4 5 6 7 8
Process finished with exit code 0
上面遍历的输出结果可以看出,第五次遍历之后排序已经完成,后面的遍历都是无效的遍历
优化排序
- 优化思路
- 在每一轮排序之后,如果有数据交换就做一个标识
- 在下一轮循环的时候,判断如果上一轮没有数据交换的话说明上一轮排序就已经完成
优化后代码(标识位)
/**
* 优化之后冒泡排序
*
* @param arrs 要排序的数组参数
*/
public static void firstBubbleSort(int arrs[]) {
for (int i = 0; i < arrs.length - 1; i++) {
boolean flag = false;
System.out.println("第" + (i + 1) + "轮遍历");
// 遍历比较交换
for (int j = 0; j < arrs.length - 1 - i; j++) {
if (arrs[j] > arrs[j + 1]) {
// 临时变量用于数据交换
int temp = arrs[j];
arrs[j] = arrs[j + 1];
arrs[j + 1] = temp;
// 有数据交互做一个标识
flag = true;
}
}
// 打印每一轮遍历的结果
System.out.println("第" + (i + 1) + "轮遍历结果:");
for (int arr : arrs) {
System.out.print(arr + "\t");
}
System.out.println("\n");
// 没有数据交互说明已经存在排序结束当次循环
if(!flag){
break;
}
}
}
输出结果(标志位):
优化之后排序
第1轮遍历
第1轮遍历结果:
5 3 1 6 7 2 4 8
第2轮遍历
第2轮遍历结果:
3 1 5 6 2 4 7 8
第3轮遍历
第3轮遍历结果:
1 3 5 2 4 6 7 8
第4轮遍历
第4轮遍历结果:
1 3 2 4 5 6 7 8
第5轮遍历
第5轮遍历结果:
1 2 3 4 5 6 7 8
第6轮遍历
第6轮遍历结果:
1 2 3 4 5 6 7 8
Process finished with exit code 0
优化结果
- 根据优化前后的结果比较可以看出少了一轮遍历