什么是冒泡排序
冒泡排序:在原数组中通过相邻两项元素的比较,交换而完成的排序算法。
算法核心
数组中相邻两项比较、交换。
算法复杂度
- 时间复杂度
实现一次排序找到最大值需要遍历 n-1次(n为数组长度)
需要这样的排序 n-1次。 需要 (n-1) * (n-1) —> O(n^2)
时间复杂度: O(n^2)
算法实现原理
我们以一次排序为例,了解冒泡排序是如何完成排序过程的。
相邻两项比较交换:
- 23 和 7 比较, 23和7 交换位置(23>7大泡泡上升)
- 23 和 33 比较, 位置不变。
- 33 和15 比较, 33 和15交换位置。
- 33 和 34 比较, 位置不变。
- 34 和 12 比较, 34和12交换位置。
- 第一轮排序结束: 34 作为最大的泡泡上升的数组的lenght-1位置。
参考实现
for(int i =0; i < a.length; i++){
for(int j =0; j < a.length - i-1; j++){
if(a[j] > [j+1] ){
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
扩展问题
对于已经有序的数组,例如a[] = {1,2,3,4,5,6,7}, 那么冒泡排序还需要进行大量的比较,这样效率并不高。
[解决方案] 我们可以做一个标记flag = true, 如果进入比较条件则改变flag的值,如果一轮循环之后,发现flag没有变化,那么说明数组是有序的,则不需要继续遍历了。
for(int i =0; i < a.length; i++){
boolean flag = true;
for(int j =0; j < a.length - i-1; j++){
if(a[j] > [j+1] ){
flag = false;
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
if(flag) break;
}