思想
冒泡排序的思想就是,两两比较相邻的两个数,按照升序或者降序进行交换。这样交换一趟之后,最大或者最小的数字就被交换到最后一位,
接着从头开始,继续进行迭代的比较,直到倒数第二位,以此类推。
例子
例如要对 6 7 4 1 5 9 进行升序的冒泡排序操作,过程如下:
第一次比较6和7 6 < 7,不交换
第二次比较7和4 7 > 4,交换
第三次比较7和1 7 > 1,交换
第四次比较7和5 7 > 5,交换
第五次比较7和9 9 > 7,不交换
第一次比较6和4 6 > 4,交换
第二次比较6和1 6 > 1,交换
第三次比较6和5 6 > 5,交换
第四次比较6和7 7 > 6,不交换
第一次比较4和1 4 > 1,交换
第二次比较4和5 5 > 4,不交换
第三次比较5和6 6 > 5,不交换
不交换
不交换
分析
可以看到,一共需要n-1趟,而每一趟过后,都有一个元素进入有序序列,那么比较的元素就要减少一个。
综上分析,需要两层循环,外循环确定趟数,内循环确定每一趟的次数。
代码
package test;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
BubbleSort bubbleSort = new BubbleSort();
int []a = {67, 69, 75, 87, 89, 90, 99, 100};
bubbleSort.bubbleSort(a);
System.out.println(Arrays.toString(a));
}
public void bubbleSort(int [] a){
if (a == null || a.length == 0) {
return;
}
for(int i = 0; i < a.length - 1; i++){// 外层循环次数,要比较n-1个数
for(int j = 0;j < a.length - 1 -i; j++ ){
if (a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j+1] = temp;
}
}
}
}
}
复杂度分析
根据代码分析,时间复杂度是O(n2)
最好情况是数组有序,为O(n)
最坏情况均是反序,为O(n2)。
冒泡排序是一种稳定排序。