冒泡排序的思想是:每次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来。比如需要将12 35 99 18 76这5个数从大到小排序。从大到小排序,意思是越小的越靠后面。
首先比较第1位和第2位的大小,现在第1位是12,第2位是35。12比35小,小的靠后,所以需要交换这两个数的位置,交换后的顺序是:
35 |
12 |
99 |
18 |
76 |
根据这个方法,继续比较第2位和第3位的大小,第2位是12,第3位是99,小的靠后,交换两个数位置后顺序如下:
35 |
99 |
12 |
18 |
76 |
接着比较第3位和第4位的大小,第3位12,第4位18。小的靠后,交换两个数以后的顺序如下:
35 |
99 |
18 |
12 |
76 |
最后比较第4位和第5位的大小,比较后的顺序如下:
35 |
99 |
18 |
76 |
12 |
经过了4次排序后最小的一个数已经出来,每次都是比较相邻的两个数,如果后面的数比前面的大,则交换两个数的位置,一直比较到最后两位数,比较完毕后最小的数就出来了,就像一个气泡一样,慢慢浮出水面。
每将一个数归位称为一趟,经过第一趟已经找到最小的数。进行过一趟后数字的顺序如下:
35 |
99 |
18 |
76 |
12 |
接下来继续刚刚的过程,将剩下的4个数意义归位。开始第二趟,目前是将第2小的数归位。
首先比较第1位和第2位,第1位比第2位小,小的往后放,交换以后的顺序如下:
99 |
35 |
18 |
76 |
12 |
比较第2位和第3位,第2位35,第3位18,小的已经在后面了不需交换位置,顺序如下:
99 |
35 |
18 |
76 |
12 |
比较第3位和第4位,第3位18,第4位76,小的往后,交换后顺序如下:
99 |
35 |
76 |
18 |
12 |
第4位和第5位不需要进行比较了,因为第一趟已经找到最小的了,进行第二趟以后的顺序如下:
99 |
35 |
76 |
18 |
12 |
进行第三趟比较,首先比较第1位和第2位,小的已经在后面了不需要进行交换,顺序不变:
99 |
35 |
76 |
18 |
12 |
比较第2位和第3位,小的靠后,交换后的顺序如下
99 |
76 |
35 |
18 |
12 |
此时第3小的数据也出来了。
然后进行第四趟,这里只需要比较第1位和第2位的数据,小的已经在后面了,所以不需要进行交换,因此最终顺序如下:
99 |
76 |
35 |
18 |
12 |
如果有n个数进行排序,只需要将n-1个数归位,即进行n-1趟操作即可。每一趟的操作从第1位开始进行相邻两个数的比较,较小的一个放后面,比较完成后向后挪动1位继续比较下面两个相邻数的大小,重复步骤直到最后一个尚未归位的数,已经归位的数就不需要进行比较了。
1 package day08; 2 3 4 5 public class BubbleSort { 6 7 public static void main(String[] args) { 8 9 int[] numbers = new int[]{12, 35, 99, 18, 76}; 10 11 for (int i = 0; i < numbers.length - 1; i++) { 12 13 for (int j = 0; j < numbers.length - 1 - i; j++) { 14 15 if (numbers[j] > numbers[j + 1]) { 16 17 int temp = numbers[j]; 18 19 numbers[j] = numbers[j + 1]; 20 21 numbers[j + 1] = temp; 22 23 } 24 25 } 26 27 } 28 29 System.out.println("排序后的数从从小到大是:"); 30 31 for (int i = 0; i < numbers.length; i++) { 32 33 System.out.print(numbers[i]+"\t"); 34 35 } 36 37 } 38 39 }
运行结果:
冒泡排序的核心是双重嵌套循环,它的时间复杂度是O(N2),和桶排序相比是节省了空间,但是时间复杂度非常高。