冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。
但是正常的冒泡排序还可以优化,当某次冒泡操作已经没有可交换的数据时,说明已经完全达到有序了,不用再继续执行后续的冒泡,此时给他一个标签,当当前数据没有发生交换时,退出当前操作。
代码示例:
public static void main(String[] args) {
MaoPao mp = new MaoPao();
Random ran = new Random();
Set<Integer> set = new HashSet<Integer>();
while(set.size()==100000?false:true){
int num = ran.nextInt(1000000)+1;
set.add(num);
}
Integer[] a = new Integer[set.size()];
set.toArray(a);
long l = System.currentTimeMillis();
mp.bubbleSort(a,a.length);
System.out.println("冒泡排序后:"+ Arrays.toString(a));
long l1 = System.currentTimeMillis();
System.out.println(l1-l);
}
// 冒泡排序,a 表示数组,n 表示数组大小
public void bubbleSort(Integer[] a, int n) {
if (n <= 1){
return;
}
for (int i = 0; i < n; ++i) {
// 提前退出冒泡循环的标志位
boolean flag = false;
for (int j = 0; j < n - i - 1; ++j) {
if (a[j] > a[j+1]) { // 交换
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
flag = true; // 表示有数据交换
}
}
if (!flag){// 没有数据交换,提前退出
break;
}
}
}
冒泡排序过程只涉及相邻的数据交换操作,所以他的谁空间复杂度为O(1),是一个原地排序算法。
而且为了保证冒泡排序的算法稳定性,当有相邻的两个元素大小相等时,我们不交换数据,相同大小的数据在排序前后不会改变顺序,所以冒泡排序算是稳定排序算大。
冒泡排序最好的情况时间复杂度是O(n),而最坏的情况是,排序的数据刚好都是倒叙排列的,我们需要进行n西冒泡操作,所以最坏情况时间复杂度为O(n2)。