冒泡排序
冒泡排序
写在前面:这里将气泡大(值较大)的上移。
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 }
参考资料(这里也有演示动画):
http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.3.1.1.htm