冒泡排序

冒泡排序的思想是:每次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来。比如需要将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),和桶排序相比是节省了空间,但是时间复杂度非常高。

上一篇:JavaScript 初使用 arguments对象


下一篇:手动实现一个二叉推、优先队列