冒泡排序是排序算法的入门算法,算法思想是每次把最小的数字往上浮,完成一趟排序后就可以发现最大的数字被沉底了,然后第二趟第二大的数字也沉底了,就这样依次类推完成排序。
我们来看一组数字
- 我们把这组数字竖起来更符合冒泡的想法
- 先比较11和3,3比11小,所以3往上浮,完成交换继续与下一个比较
- 然后比较11和5,完成交换,继续比较
继续比较,交换
… …
当比较到最后的时候
- 到这里11这个最大的数字已经沉底了,下面完成第二趟
第二大的数字9已经完成了沉底
依次类推,我们是9个数字,就得8趟就可以完成排序
所以外层循环就是我们的趟数,内层循环就是控制相邻两个数字交换
下面我们来写代码:
代码实现:
public static void bubbleSort(int[] array) {
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;
}
}
}
}
下来我们来想另外一个问题,如果我一趟下来没有元素交换,也就是说我的序列本来就是有序的,难道我们还要让代码一次次的判断吗,所以我们队冒泡排序进行优化
冒泡的优化
public static void bubbleSort(int[] array) {
int temp = 0;
boolean bool = 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]) {
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
bool = true;
}
}
if(!bool) {
return;
}
}
}
只要加上一个标志位来判断一趟循环后会不会发生交换就好了。
因为冒泡排序交换的时候总是和相邻数字进行交换,所以冒泡排序是稳定的
特点:
稳定
经过我们的优化,我们可以知道当待排序列是有序的时候,只需要执行一趟,发现没有交换就可以直接返回了,所以冒泡排序的最优时间复杂度为O(n),最坏时间复杂度也就是待排序列逆序的时候,为O(n2),一般情况下,平均时间复杂度为O(n2)
最优时间复杂度:
O(n)
最坏时间复杂度:
O(n2)
平均时间复杂度:
O(n2)
在该过程中没有借助辅助数组所以空间复杂度为O(1)
空间复杂度:
O(1)