本文主要描述3個時間複雜度爲n2的排序算法:冒泡排序、選擇排序、插入排序。算法
1.冒泡排序:由數組頭部開始,一次比較兩個元素,若是他們的順序錯誤就把他們交換過來。每次交換完成後,當前數組最大值就會被放在最後。數組
1 public int[] bubbleSort(int[] a, int n) 2 { 3 for (int j = 0; j < n - 2; j++) 4 { 5 for (int i = 0; i < n - j - 1; i++) 6 {// 若是當前數比下一個大,交換,不然繼續看下一個數 7 if (a[i] > a[i + 1]) 8 { 9 int temp = a[i + 1]; 10 a[i + 1] = a[i]; 11 a[i] = temp; 12 } 13 } 14 } 15 return a; 16 } 17
傳入參數:a爲待排序數組,n爲數組長度。優化
第一個for循環,用j的值控制第二個循環,即比對數組的長度。由冒泡排序的定義可知,每一次都會將最大值放在最後,因此下一次排的時候就能夠少管一個數;spa
第二個for循環,將兩個數比對,大的放在後面。code
本題第一個for循環是一種小小的優化,能夠不使用,直接對整個數組進行交換也是沒有問題的。blog
2.選擇排序:每次在數組中選擇最小的一個數,將其依次放在數組頭對應位置。排序
1 public int[] selectionSort(int[] a, int n) 2 { 3 for (int j = 0; j < n - 1; j++) 4 {//j表示須要在以j開始的數組裏面尋找一個最大值填充j位 5 int maxi = 0; 6 for (int i = 0; i < n - j; i++) 7 {// maxi表示當前序列最大值的下標 8 if (a[maxi] < a[i]) 9 { 10 maxi = i; 11 } 12 } 13 if (maxi != n - j - 1) 14 { 15 int temp = a[n - j - 1]; 16 a[n - j - 1] = a[maxi]; 17 a[maxi] = temp; 18 } 19 } 20 return a; 21 }
3.插入排序:將其模擬爲往一個有序數組中插入一個值。關鍵在於須要把有序數組比當前數大的數字一個個日後移動。io
1 public int[] insertionSort(int[] a, int n) 2 { 3 for (int i = 1; i < n; i++) 4 {//認爲a[0]只有一個數,是有序的。因此從第二個數開始插入 5 int nowNum = a[i]; 6 int j = i - 1; 7 for (; j >= 0; j--) 8 {//把全部比插入數大的數字日後挪,循環結束後就會留出一個空位 9 if (nowNum < a[j]) 10 { 11 a[j + 1] = a[j]; 12 } 13 else 14 { 15 break; 16 } 17 } 18 a[++j] = nowNum; 19 } 20 return a; 21 }