一、基本排序演算法
1、 氣泡排序
假如我們現在按身高公升序排隊,一種排隊的方法是:從第一名開始,讓兩人相互比身高,若前者高則交換位置,更高的那個在與剩下的人比,這樣一趟下來之後最高的人就站到了隊尾。接著重複以上過程,直到最矮的人站在了佇列首部。我們把隊頭看作水底,隊尾看作水面,那麼第一趟比較下來,最高的人就像泡泡一樣從水底」冒「到水面,第二趟比較則是第二高的人……排隊的過程即為對資料物件進行排序的過程(這裡我們排序的」指標「是身高),上述過程即描述了氣泡排序的思想。從以上過程我們可以看到,若對n個人進行排隊,我們需要n-1趟比較,而且第k趟比較需要進行n-k次比較。通過這些資訊,我們能夠很容易的算出氣泡排序的複雜的。首先,排序演算法通常都以資料物件的兩兩比較作為」關鍵操作「,這裡我們可以得出,氣泡排序需要進行的比較次數為: (n-1) + (n-2) + … + 1 = n*(n-1) / 2,因此氣泡排序的時間複雜度為o(n^2)。
2. 選擇排序
回到上面我們提到的排隊問題,除了上面提到的方法,還有這樣一種排隊的方法,讓目前隊頭的人依次與其後的每個人進行比較,比較後較矮的那個人繼續與後面的人進行比較,這樣第一趟比較下來,就能夠找到最矮的人, 然後把這個最矮的人和當前隊頭的人交換一下位置。然後第二趟比較,讓第二名依次與後面比較,可以找到第二矮的人,然後讓第二矮的人和當前佇列第二名交換位置,依此類推,一共進行n-1趟比較後,就能完成整個排隊過程。根據上述描述,我們可以知道,第k趟比較需要進行的陣列元素的兩兩比較的次數為n-k次,所以共需要的比較次數為n*(n-1) / 2,因此選擇排序演算法的時間複雜度與氣泡排序一樣,也為o(n^2)。
3. 插入排序
回想下我們平時打撲克抓牌的過程,通常我們用右手抓牌,每抓一張牌,就放到左手上,抓下一張牌後,會把這張牌依次與左手上的牌比較,並把它插入到乙個合適的位置(通常按照牌面大小)。上述的過程即為插入排序的過程,假設待排序陣列為a,我們從a[1]開始,讓a[1]與a[0]比較,若a[1]較小,則讓a[1]和a[0]交換位置,此時a[0]和a[1]就相當於已經放入左手中的牌。然後我們再讓a[2]與a[1]、a[0]比較,並為它找到乙個合適的位置,以此類推,直到為陣列的最後乙個元素也找到了合適的位置。理解了插入排序的思想後,我們便能夠得到它的時間複雜度。對於n個元素,一共需要進行n-1輪比較,而第k輪比較需要進行k次數組元素的兩兩比較,因此共需要進行的比較次數為:1 + 2 + … + (n-1),所以插入排序的時間複雜度同氣泡排序一樣,也為o(n^2)。
4. 希爾排序
希爾排序是對插入排序的一種改進,它的核心思想是將待排序陣列中任意間隔為h的元素都變為有序的,這樣的陣列叫做h有序陣列。比如陣列[5, 3, 2, 8, 6, 4, 7, 9, 5], 我們可以看到a[0]、a[3]、a[6]是有序的,a[1]、a[4]、a[7]是有序的,a[2]、a[5]、a[8]是有序的,因此這個陣列是乙個h有序陣列(h=3)。根據h有序陣列的定:義,我們可以知道,當h=1時,相應的h有序陣列就是乙個已經排序完畢的陣列了。希爾排序的大致過程如下:把待排序陣列分割為若干子串行(乙個子串行中的元素在原陣列中間隔為h,即中間隔了h-1個元素),然後對每個子串行分別進行插入排序。然後再逐漸減小h,重複以上過程,直至h變為足夠小時,再對整體進行一次插入排序。由於h足夠小時,待排序陣列的逆序數已經很小,所以再進行一次希爾排序是很快的。希爾排序通常要比插入排序更加高效。 實現希爾排序時,我們需要選取乙個h的取值序列,這裡我們直接採用演算法(第4版) (豆瓣)一書中提供的h取值序列(1,4,13,40,121, …)。即h = 3 * k + 1,其中k為[0, n/3)區間內的整數。
二、歸併排序
歸併排序使用了一種叫做」分治「的思想來解決排序問題。分治也就是"分而治之「,也就是把乙個大問題分解為眾多子問題,而後分別得到每個子問題的解,最終以某種方式合併這些子問題的解就可以得到原問題的解。歸併排序的主要思想是:將待排序陣列遞迴的分解成兩半,分別對它們進行排序,然後將結果「歸併」(遞迴的合併)起來。我們知道,遞迴演算法都有乙個base case,遞迴分解陣列的base case就是分解完的兩個陣列長度為為1,這時候它們本身就有序,此時就可以進行歸併了。
三、快速排序
快速排序是目前應用最廣泛的排序演算法之一,它是一般場景中大規模資料排序的首選,它的實際效能要好於歸併排序。通常情況下,快速排序的時間複雜度為o(nlogn),但在最壞情況下它的時間複雜度會退化至o(n^2),不過我們可以通過對輸入陣列進行「隨機化」(打亂元素的排列順序)來避免最壞情況的發生。除了實際執行效能好,快速排序的另乙個優勢是它能夠實現「原地排序」,也就是說它幾乎不需要額外的空間來輔助排序。
快速排序的主要思想如下:假設待排序陣列為a[0…n-1],遞迴的對該陣列執行以下過程:選取乙個切分元素,而後通過陣列元素的交換將這個切分元素移動到位置j,使得所有a[0…j-1]的元素都小於等於a[j],所有a[j+1…n-1]的元素都大於等於a[j]。
在快速排序中,切分元素的選取很關鍵,通常我們可以選取輸入陣列的第乙個元素作為切分元素,然後把它交換到陣列中的合適位置使得它左邊的元素都小於等於它,右邊的元素都大於等於它,而後對其左右兩邊的子陣列遞迴執行切分過程,即可完成對整個陣列的排序。
四、堆排序
堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法:
大頂堆:每個節點的值都大於或等於其子節點的值,在堆排序演算法中用於公升序排列;
小頂堆:每個節點的值都小於或等於其子節點的值,在堆排序演算法中用於降序排列;
堆排序的平均時間複雜度為 ο(nlogn)。
各個排序演算法( )
排序圖表 一 插入排序 每次將乙個待排序的資料,跟前面已經有序的序列的數字一一比較找到自己合適的位置,插入到序列中,直到全部資料插入完成。二 希爾排序 先將整個待排元素序列分割成若干個子串行 由相隔某個 增量 的元素組成的 分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序...
排序演算法介紹
排序也稱排序演算法 sort algorithm 排序是將一組資料,依指定的順序進行排列的過程。1 內部排序 指將需要處理的所有資料都載入到內部儲存器 記憶體 中進行排序。2 外部排序法 資料量過大,無法全部載入到記憶體中,需要借助外部儲存 檔案等 進行排序。1 穩定 如果 a 原本在 b 前面,而...
排序演算法介紹
排序也成排序演算法 sort algorithm 排序是將一組資料,依指定的順序進行排列的過程。排序的分類 1內部排序 需要處理的所有資料都載入到內部儲存器中進行排序 2外部排序 資料量過大,無法全部載入到記憶體中,需要借助外部儲存進行排序 常見的排序演算法 時間頻度 乙個演算法中的語句執行次數稱為...