package com.sort; /** * 冒泡排序算法 * 比較相鄰的元素,若是第一個比第二個大,就交換它們。 * 對每一對相鄰元素作一樣的工做,從開始的第一對到結尾的最後一對,在這一點上,最後元素是最大的數。 * 針對全部的元素重複以上的動做,除了最後一個元素。 * 持續每次對愈來愈少的元素重複上面的動做,直到沒有任何一對元素須要比較。 * * 時間複雜度 * 平均狀況:O(n2), 最好狀況:O(n), 最壞狀況:O(n2) * * 空間複雜度 * 輔助存儲:O(1) * * 穩定性:穩定 */ public class BubbleSort{ /** * * @Title: sort * @Description: 假設數組長度爲n,每完成一次大循環將最小的冒泡到上端,要完成全部元素排序,須要通過n次大循環, * 小循環進行兩兩相鄰元素對比,若是反序則交換位置,小循環從最後開始比較,次數逐次遞減, * 加入flag布爾變量改進冒泡算法,使其對有序數組的排序時間複雜度變爲O(n)。 */ public static void sort(Comparable[] a) { int compareNum = 0; int swapNum = 0; int size = a.length; boolean flag = true; for(int i=0; i<size && flag; i++) { flag = false; for(int j=size-1; j>i; j--) { System.out.println("compare num:" + (++compareNum)); if(less(a[j], a[j-1])) { swap(a, j, j-1); flag = true; System.out.println("swap num:" + (++swapNum)); } } } } public static void show(Comparable[] a) { for(int i=0; i<a.length; i++) { System.out.print(a[i] + " "); } System.out.println(); } private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } private static void swap(Comparable[] a, int i, int j) { Comparable t = a[i]; a[i] = a[j]; a[j] = t; } public static void main(String[] args) { Integer a[] = {23, 44, 56, 91, 2, 0, 81,100, 3, 17}; Integer b[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //無序數組排序 sort(a); show(a); //有序數組排序 sort(b); show(b); } }