原理

依次两两比较相邻的元素大小,将较大的放在右边,这样每趟下来就把最大的值放到了最右边,重复以上步骤(n-1)趟,就实现了把所有元素升序排列。

举例(以升序为例)

原始数组:3 8 2 9 1 4

第一趟:      3 2 8 1 4 9

第二趟:      2 3 1 4 8 9

第三趟:      2 1 3 4 8 9

第四趟:      1 2 3 4 8 9

第五趟:      1 2 3 4 8 9

最后一趟,就剩最后一个元素1,一定是最小的,就不用再比较了,因此总共需要比较(n-1)趟,n为数组长度。

其实也可以看到,第四趟的时候,数组就已经是升序的,不再需要比较了。因此可以优化,当没有数据可以交换时,就认为已经达到有序状态

代码实现

public static void main(String[] args) {
int[] arr = {1,23,98,25,4,7,8,35};
bubbleSort(arr);
System.out.println("排序后为:");
System.out.println(Arrays.toString(arr));
}

public static void bubbleSort(int[] arr){
for (int i = 0; i < arr.length - 1; i++) { //总共需要比较(n-1)趟
boolean sortedFlag = true;
for (int j = 0; j < arr.length - 1 - i; j++) { //每趟需要比较(n-i)次,1<=i<=n-1
if(arr[j]>arr[j+1]){
int t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
sortedFlag = false;
}
}
if(sortedFlag) break;
}
}

打印结果为:[1, 4, 7, 8, 23, 25, 35, 98]

时间复杂度

1、如果原始数组本来就是升序,则只需要比较一趟,循环(n-1)次内层循环比较,时间复杂度为O(n)

2、如果最坏情况本来数组是反序的,则需要比较(n-1)趟,每趟进行(n-i)次比较,1<=i<=n-1,时间复杂度为O(n^2)

综上,冒泡排序的时间复杂度为O(n^2)

空间复杂度

由于冒泡排序只是数组内的元素交换,并没有占用额外的存储空间,因此空间复杂度为O(1)