基本思想:
对待排序数组,从第一个数开始,依次比较相邻元素的值,若逆序则交换
每一轮比较都能让一个元素移动到正确位置,故总共需要进行数组长度 - 1轮排序
每轮的两两比较次数较于上一轮减少一次
代码实现:
//冒泡排序
public void bubbleSort() {
int temp = 0;
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
算法优化:
在排序未结束时,可能数组已经有序,后几轮的排序中未进行元素交换,造成了时间浪费
增设变量flag用于判断该轮排序中是否有元素交换,若无元素交换则数组已经有序,跳出循环
代码实现:
//冒泡排序优化
public void superBubbleSort() {
int temp = 0;
boolean flag = false;
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j + 1]) {
flag = true;
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
if (!flag) {
break;
} else {
flag = false;
}
}
}
时间复杂度:
优化前:O(n²)
优化后:最好情况时(原数组已经有序)可以达到O(n)
稳定性:
在相邻元素进行比较时,若相等则不发生交换,故冒泡排序是稳定的