冒泡排序(起泡排序),与选择排序很像,都是两层 for 循环,但具体有一些差异,看图:
由图可以看出来,冒泡排序每次比较的是相邻的两个元素的值,然后将大的数往后交换,这样一轮循环完,就会将最大的数排在当前的最后(前一轮最后的一个已经是最大了,不参与下一轮循环),看代码:
package sort;
import java.util.Arrays;
public class BobboSort {
public static void sort(int[] a) {
for(int i=a.length-1; i >= 0; i--) {
for(int j=0; j < i; j++) {
if(a[j] > a[j+1]) {
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
public static void main(String[] args) {
int[] a = {3,9,-4,0,16,7,20,5,2};
sort(a);
System.out.println(Arrays.toString(a));
}
}
打印一下,每层循环的情况:
i:8,j:0,j+1:1——>[3, 9, -4, 0, 16, 7, 20, 5, 2]
i:8,j:1,j+1:2——>[3, -4, 9, 0, 16, 7, 20, 5, 2]
i:8,j:2,j+1:3——>[3, -4, 0, 9, 16, 7, 20, 5, 2]
i:8,j:3,j+1:4——>[3, -4, 0, 9, 16, 7, 20, 5, 2]
i:8,j:4,j+1:5——>[3, -4, 0, 9, 7, 16, 20, 5, 2]
i:8,j:5,j+1:6——>[3, -4, 0, 9, 7, 16, 20, 5, 2]
i:8,j:6,j+1:7——>[3, -4, 0, 9, 7, 16, 5, 20, 2]
i:8,j:7,j+1:8——>[3, -4, 0, 9, 7, 16, 5, 2, 20]
i:7,j:0,j+1:1——>[-4, 3, 0, 9, 7, 16, 5, 2, 20]
i:7,j:1,j+1:2——>[-4, 0, 3, 9, 7, 16, 5, 2, 20]
i:7,j:2,j+1:3——>[-4, 0, 3, 9, 7, 16, 5, 2, 20]
i:7,j:3,j+1:4——>[-4, 0, 3, 7, 9, 16, 5, 2, 20]
i:7,j:4,j+1:5——>[-4, 0, 3, 7, 9, 16, 5, 2, 20]
i:7,j:5,j+1:6——>[-4, 0, 3, 7, 9, 5, 16, 2, 20]
i:7,j:6,j+1:7——>[-4, 0, 3, 7, 9, 5, 2, 16, 20]
i:6,j:0,j+1:1——>[-4, 0, 3, 7, 9, 5, 2, 16, 20]
i:6,j:1,j+1:2——>[-4, 0, 3, 7, 9, 5, 2, 16, 20]
i:6,j:2,j+1:3——>[-4, 0, 3, 7, 9, 5, 2, 16, 20]
i:6,j:3,j+1:4——>[-4, 0, 3, 7, 9, 5, 2, 16, 20]
i:6,j:4,j+1:5——>[-4, 0, 3, 7, 5, 9, 2, 16, 20]
i:6,j:5,j+1:6——>[-4, 0, 3, 7, 5, 2, 9, 16, 20]
i:5,j:0,j+1:1——>[-4, 0, 3, 7, 5, 2, 9, 16, 20]
i:5,j:1,j+1:2——>[-4, 0, 3, 7, 5, 2, 9, 16, 20]
i:5,j:2,j+1:3——>[-4, 0, 3, 7, 5, 2, 9, 16, 20]
i:5,j:3,j+1:4——>[-4, 0, 3, 5, 7, 2, 9, 16, 20]
i:5,j:4,j+1:5——>[-4, 0, 3, 5, 2, 7, 9, 16, 20]
i:4,j:0,j+1:1——>[-4, 0, 3, 5, 2, 7, 9, 16, 20]
i:4,j:1,j+1:2——>[-4, 0, 3, 5, 2, 7, 9, 16, 20]
i:4,j:2,j+1:3——>[-4, 0, 3, 5, 2, 7, 9, 16, 20]
i:4,j:3,j+1:4——>[-4, 0, 3, 2, 5, 7, 9, 16, 20]
i:3,j:0,j+1:1——>[-4, 0, 3, 2, 5, 7, 9, 16, 20]
i:3,j:1,j+1:2——>[-4, 0, 3, 2, 5, 7, 9, 16, 20]
i:3,j:2,j+1:3——>[-4, 0, 2, 3, 5, 7, 9, 16, 20]
i:2,j:0,j+1:1——>[-4, 0, 2, 3, 5, 7, 9, 16, 20]
i:2,j:1,j+1:2——>[-4, 0, 2, 3, 5, 7, 9, 16, 20]
i:1,j:0,j+1:1——>[-4, 0, 2, 3, 5, 7, 9, 16, 20]
注:它每次比较的是相邻的两个元素的大小,一层 i 循环完,最大的元素浮出水面(排到最后),就像一个气泡从水底浮出水面,越来越大。
以上就是冒泡排序,时间复杂度为:O(n的平方)。