一、基本介绍
冒泡排序是通过对待排序序列从前向后,依次比较相邻元素的值,如果逆序则交换顺序,使值大的元素移向后部。冒泡排序是一种稳定的算法,时间复杂度 O(n2)。
二、排序过程
对数组 [10 , 20 , 13 , 8 ] 的排序过程如下:
1. 第一趟排序
- 第一次排序:10和20比较大小,10小于20,不交换位置 ,[10 , 20 , 13 , 8]
- 第二次排序:20和13比较大小,20大于13,交换20和13的位置,[10 , 13, 20 , 8]
- 第三次排序:20和8比较大小,20大于8,交换20和8的位置,[10 , 13 , 8 , 20]
2. 第二趟排序
- 第一次排序:10和13比较大小,10小于13,不交换位置 ,[10 , 13 , 8 , 20]
- 第二次排序:13和8比较大小,13大于8,交换13和8的位置,[10 , 8 , 13 , 20]
3. 第三趟排序
- 第一次排序:10和8比较大小,10大于8,交换10和8的位置 ,[8 , 10 , 13 , 20]
这个时候数组变排好序了。可以看出,当数组中的元素个数为 m 时,需要进行 m-1 趟排序,每趟排序中,需要进行 (m-趟数) 次。
三、代码实现
- 在实现过程中,设置一个标识,当一个序列已经有序时,后面就不需要在进行遍历了,此时便可以直接跳出循环。
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2 ){
return;
}
int temp = 0;//定义一个临时变量
boolean flag = false;//设置一个标识判断是否已经有序
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;//有交换,还不是有序的,置为true
}
}
if (!flag) {
break;//后续的序列有序,跳出循环
} else {
flag = false;//将标志重新置为false
}
}
}