冒泡排序

冒泡排序

写在前面:这里将气泡大(值较大)的上移。

 1 import java.util.Arrays;
 2 
 3 /**
 4  * 冒泡排序.算法描述:
 5  * 初始,a[0...n-1]为无序区,“垂直排列”;
 6  * 第一趟扫描,从无序区底部向上,两两比较相邻气泡,大气泡(较大值)上移;第一趟扫描结束,最大的气泡移到顶部(即有序区);
 7  * 重复扫描无序区a[0...n-2];
 8  * 总共进行n-1趟扫描得到有序区,或者若一趟扫描中未发生气泡位置的交换,说明已全部有序。
 9  * O(T) = n*(n+1)/2
10  * @author yi
11  * @date 2015年7月3日
12  *
13  * @me 1. while 很好用啊 while(len-1>0 && unSequenced) 2.跳出循环的条件 3.标志位的名字问题 4.方法外提,减少主函数体
14  */
15 public class BubbleSort {
16     /**
17      * 冒泡排序
18      * 
19      * @param arr
20      */
21     public static void bubblesort(int[] arr) {
22         int len = arr.length;
23         // 标志一次循环中是否进行了交换
24         boolean unSequenced = true;
25         // 每次循环都将最大值移到数组尾,下一次循环的元素数减1
26         // 若上一次循环未交换任何元素,说明已有序
27         while(len-1>0 && unSequenced) {
28             unSequenced = false;
29             // 两两比较相邻元素,较大值后移
30             for(int j = 0; j < len-1; j++) {
31                 if(arr[j] > arr[j+1]) {
32                     swap(arr, j, j+1);
33                     unSequenced = true;
34                 }
35             }
36             len--;
37             // 每次循环后打印排序结果
38             System.out.println(Arrays.toString(arr));
39         }
40     }
41     
42     /**
43      * 交换数组元素
44      * 
45      * @param arr
46      * @param i
47      * @param j
48      */
49     static void swap(int[] arr, int i, int j) {
50         int tmp = arr[i];
51         arr[i] = arr[j];
52         arr[j] = tmp;
53     }
54     
55     /**
56      * 主函数,定义测试数据,调用冒泡排序方法
57      * 
58      * @param argus
59      */
60     public static void main(String[] argus) {
61         // 测试例子
62 //        int[] arr = {6, 2, 4, 1, 5, 9};           // 显示引入标志位后的优化效果
63         int[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1};  // 显示冒泡排序:每次将最大值移到最后
64         System.out.println(Arrays.toString(arr));
65         BubbleSort.bubblesort(arr);
66     }
67 }
View Code

参考资料(这里也有演示动画):

http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.3.1.1.htm

原文地址:https://www.cnblogs.com/xhz-dalalala/p/4618792.html