學習Demo
冒泡排序【重點:閉着眼睛都應該會寫】
-
冒泡排序無疑是最為出名的排序算法之一,總共有八大排序。
-
兩層循環,外層冒泡輪數,里層依次比較,江湖中人盡皆知。
-
由於嵌套循環,冒泡排序的時間復雜度高:O(n2)
思考:如何優化?
如果數組中的幾個數已經排好序了,就沒必要再去全部比較一輪了
碼上行動
package array; import java.util.Arrays; /** * 冒泡排序【重點:閉着眼睛都應該會寫】 * 冒泡排序無疑是最為出名的排序算法之一,總共有八大排序。 * 兩層循環,外層冒泡輪數,里層依次比較,江湖中人盡皆知。 * 由於嵌套循環,冒泡排序的時間復雜度高:O(n2) * * 思考:如何優化? * 如果數組中的幾個數已經排好序了,就沒必要再去全部比較一輪了 */ public class ArrayDemo5 { public static void main(String[] args) { //定義數組 int[] a = {1,4,5,6,72,2,2,2,25,6,7}; //調用排序方法,返回排序后的數組 int[] sort = sort(a); //輸出排序后的數組 System.out.println(Arrays.toString(sort)); } /* 冒泡排序: 1. 比較數組中,兩個相鄰的元素,如果第一個數比第二個數大,我們就交換他們的位置 2. 每一次比較,都會產生出一個最大或者最小的數字 3. 下一輪則可以少一次排序 4. 依次循環,直到結束 */ public static int[] sort(int[] array){ //臨時變量 用來交換位置 int temp = 0; //外層循環,判斷我們這個要走多少次 for (int i = 0; i < array.length -1; i++) { //小小優化:通過flag標識位減少沒有意義的比較 boolean flag = false; //內層循環,比較判斷兩個數,如果第一個數比第二個數大,則交換位置(小數在前,大數在后,從小到大) for (int j = 0; j < array.length - 1 - i; j++) { if (array[j + 1] > array[j]) { //此處從大到小排序(大數在前,小數在后),如果實現從小到大,只需要將 ">" 改為 "<" (小數在前,大數在后) temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; //只要排序一次(存在交換),則給flag賦值為true flag = true; } } //如果flag為false,說明沒有排序(不存在交換,已經有序),則break跳出(減少沒必要的排序,優化排序次數,降低時間成本) if (flag == false) { break; } } return array; } }