排序算法分類
排序算法大體可分爲兩種:
一種是比較排序,時間複雜度O(nlogn) ~ O(n^2),主要有:冒泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等。
另一種是非比較排序,時間複雜度可以達到O(n),主要有:計數排序,基數排序,桶排序等。
這裏我們來探討一下常用的比較排序算法。下表給出了常見比較排序算法的性能:(圖表來自網絡)
排序算法穩定性的簡單形式化定義爲:如果Ai = Aj,排序前Ai在Aj之前,排序後Ai還在Aj之前,則稱這種排序算法是穩定的。通俗地講就是保證排序前後兩個相等的數的相對順序不變。
冒泡排序(Bubble Sort)
冒泡排序是簡單經典的排序算法,它重複地走訪過要排序的元素,依次比較相鄰兩個元素,如果他們的順序錯誤就把他們調換過來,直到沒有元素再需要交換,排序完成。這個算法的名字由來是因爲越小(或越大)的元素會經由交換慢慢“浮”到數列的頂端。
冒泡排序算法的運作如下:
- 比較相鄰的元素,如果前一個比後一個大,就把它們兩個調換位置。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
- 針對所有的元素重複以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
代碼如下:
public class BubbleDemo {
public static void main(String[] args) {
int[] arr = { 2, 3, 4, 0, 1, 5, 8 };
System.out.println("排序前數組爲:");
for (int num : arr) {
System.out.print(num + " ");
}
for(int i= 0;i<arr.length-1;i++) {//外層循環控制排序趟數
for(int j = 0;j<arr.length-i-1;j++) {//內層循環控制每一趟排序多少次
if(arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j]= arr[j+1];
arr[j+1]= temp;
}
}
}
System.out.println("");
System.out.println("排序後數組爲:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
冒泡排序的優點:
每進行一趟排序,就會少比較一次,因爲每進行一趟排序都會找出一個較大值。如上例:第一趟比較之後,排在最後的一個數一定是最大的一個數,第二趟排序的時候,只需要比較除了最後一個數以外的其他的數,同樣也能找出一個最大的數排在參與第二趟比較的數後面,第三趟比較的時候,只需要比較除了最後兩個數以外的其他的數,以此類推……也就是說,沒進行一趟比較,每一趟少比較一次,一定程度上減少了算法的量。