目录
1. 冒泡排序动画
2. 冒泡排序 Java 实现
public void bubbleSort(int[] numbers) {
int length = numbers.length;
if (length <= 1) {
return;
}
for (int i = 0; i < length; ++i) {
// 数据交换的标记,表示当前循环是否有数据交换
boolean swapFlag = false;
for (int j = 0; j < length - i - 1; ++j) {
// 相邻位置两两比较
if (numbers[j] > numbers[j + 1]) {
// 前面数字大于后面,则交换位置
numbers[j] ^= numbers[j + 1];
numbers[j+1] ^= numbers[j];
numbers[j] ^= numbers[j + 1];
// 本次循环有数据交换,标记设为 true
swapFlag = true;
}
}
if (!swapFlag) {
// 没有数据交换,提前退出
break;
}
}
}
3. 总结
时间复杂度
最好情况下,数据已经是有序的,时间复杂度 O(n)
最坏情况下,数组为逆序数组,时间复杂度 O(n^2)
冒泡排序时间复杂度 O(n^2)
空间复杂度
数据交换在原数组中进行,标记位使用常数级的空间,所以空间复杂度 O(1)
排序稳定性
判断 a[j] > a[j+1] ,只有当 a[j] > a[j+1] 时才交换顺序
相同大小的数据在排序前后不会改变顺序,所以冒泡是稳定排序