1. 導言
由於這是排序算法系列的第一篇文章,因此多囉嗦幾句。面試
排序是很常見的算法之一,如今不少編程語言都集成了一些排序算法,好比Java 的Arrays.sort()方法,這種方式讓咱們能夠不在意內部實現細節而直接調用,在實際的軟件開發當中也會常常使用到。可是站在開發者的角度而言,知其然必須知其因此然。多練練排序算法,不只可以讓咱們知道一些排序方法的底層實現細節,更可以鍛鍊咱們的思惟,提高編程能力。如今不少技術面試也會涉及到基本的排序算法,因此多練習是有好處的。算法
文中涉及到的代碼都是Java實現的,可是不會涉及到太多的Java語言特性,而且我會加上詳細的註釋,幫助你理解代碼而且轉換成你熟悉的編程語言。編程
常見的排序算法有如下10種:數組
在開始具體的排序算法講解以前,先得明白兩個概念:編程語言
2. 言歸正傳
冒泡排序的思路其實很簡單,一個數據跟它相鄰的數據進行大小的比較,若是知足大小關係,就將這兩個數據交換位置。一直重複這個操做,就能將數據排序。 優化
舉個例子,假若有數組 a[3,5,1,4,9,6],第一次冒泡的操做以下圖所示:
重複進行這個操做,6次冒泡以後,數據排序完成。spa
根據這個思路,應該能很容易可以寫出下面的代碼實現冒泡排序:code
public class BubbleSort { //data表示整型數組,n表示數組大小 public static void bubbleSort(int[] data, int n){ //數組大小小於等於1,無須排序 if (n <= 1) return; for (int i = 0; i < n; i++) { for (int j = 0; j < n - i - 1; j++) { //若是data[j] > data[j + 1],交換兩個數據的位置 if (data[j] > data[j + 1]){ int temp = data[j]; data[j] = data[j + 1]; data[j + 1] = temp; } } } } }
可是這個排序算法還能夠進行優化,當冒泡操做已經沒有數據交換的時候,說明排序已經完成,就不用在進行冒泡操做了。例如上面的例子,第一次冒泡以後,數據爲 [3,1,4,5,6,9],再進行一次冒泡,數據變爲 [1,3,4,5,6,9],此時已經完成了排序,就能夠結束循環了。blog
因此針對這個數組的排序,上面的代碼須要6次冒泡才能完成,其中有4次都是不須要的。因此能夠對代碼進行優化:排序
public class BubbleSort { //優化後的冒泡排序 //data表示整型數組,n表示數組大小 public static void bubbleSort(int[] data, int n){ //數組大小小於等於1,無須排序,返回空 if (n <= 1) return; for (int i = 0; i < n; i++) { boolean flag = false;//判斷是否有數據交換 for (int j = 0; j < n - i - 1; j++) { //若是data[j] > data[j + 1],交換兩個數據的位置 if (data[j] > data[j + 1]){ int temp = data[j]; data[j] = data[j + 1]; data[j + 1] = temp; flag = true;//表示有數據交換 } } //若是沒有數據交換,則直接退出循環 if (!flag) break; } } }
好了,冒泡排序的基本思路和代碼都已經實現,最後總結一下: