當前位置:成語大全網 - 新華字典 - 面試必會八大排序算法(Python)

面試必會八大排序算法(Python)

壹、插入排序

介紹

插入排序的基本操作就是將壹個數據插入到已經排好序的有序數據中,從而得到壹個新的、個數加壹的有序數據。

算法適用於少量數據的排序,時間復雜度為O(n^2)。

插入排算法是穩定的排序方法。

步驟

①從第壹個元素開始,該元素可以認為已經被排序

②取出下壹個元素,在已經排序的元素序列中從後向前掃描

③如果該元素(已排序)大於新元素,將該元素移到下壹位置

④重復步驟3,直到找到已排序的元素小於或者等於新元素的位置

⑤將新元素插入到該位置中

⑥重復步驟2

排序演示

算法實現

二、冒泡排序

介紹

冒泡排序(Bubble Sort)是壹種簡單的排序算法,時間復雜度為O(n^2)。

它重復地走訪過要排序的數列,壹次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。

這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

原理

循環遍歷列表,每次循環找出循環最大的元素排在後面;

需要使用嵌套循環實現:外層循環控制總循環次數,內層循環負責每輪的循環比較。

步驟

①比較相鄰的元素。如果第壹個比第二個大,就交換他們兩個。

②對每壹對相鄰元素作同樣的工作,從開始第壹對到結尾的最後壹對。在這壹點,最後的元素應該會是最大的數。

③針對所有的元素重復以上的步驟,除了最後壹個。

④持續每次對越來越少的元素重復上面的步驟,直到沒有任何壹對數字需要比較。

算法實現:

三、快速排序

介紹

快速排序(Quicksort)是對冒泡排序的壹種改進,借用了分治的思想,由C. A. R. Hoare在1962年提出。

基本思想

快速排序的基本思想是:挖坑填數 + 分治法。

首先選出壹個軸值(pivot,也有叫基準的),通過壹趟排序將待排記錄分隔成獨立的兩部分,其中壹部分記錄的關鍵字均比另壹部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。

實現步驟

①從數列中挑出壹個元素,稱為 “基準”(pivot);

②重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任壹邊);

③對所有兩個小數列重復第二步,直至各區間只有壹個數。

排序演示

算法實現

四、希爾排序

介紹

希爾排序(Shell Sort)是插入排序的壹種,也是縮小增量排序,是直接插入排序算法的壹種更高效的改進版本。希爾排序是非穩定排序算法,時間復雜度為:O(1.3n)。

希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

·插入排序在對幾乎已經排好序的數據操作時, 效率高, 即可以達到線性排序的效率;

·但插入排序壹般來說是低效的, 因為插入排序每次只能將數據移動壹位。

基本思想

①希爾排序是把記錄按下標的壹定量分組,對每組使用直接插入算法排序;

②隨著增量逐漸減少,每組包1含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成壹組,算法被終止。

排序演示

算法實現

五、選擇排序

介紹

選擇排序(Selection sort)是壹種簡單直觀的排序算法,時間復雜度為Ο(n2)。

基本思想

選擇排序的基本思想:比較 + 交換。

第壹趟,在待排序記錄r1 ~ r[n]中選出最小的記錄,將它與r1交換;

第二趟,在待排序記錄r2 ~ r[n]中選出最小的記錄,將它與r2交換;

以此類推,第 i 趟,在待排序記錄ri ~ r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢。

排序演示

選擇排序的示例動畫。紅色表示當前最小值,黃色表示已排序序列,藍色表示當前位置。

算法實現

六、堆排序

介紹

堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的壹種排序算法,它是選擇排序的壹種。

利用數組的特點快速指定索引的元素。

基本思想

堆分為大根堆和小根堆,是完全二叉樹。

大根堆的要求是每個節點的值不大於其父節點的值,即A[PARENT[i]] >=A[i]。

在數組的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值壹定在堆頂。

排序演示

算法實現

七、歸並排序

介紹

歸並排序(Merge sort)是建立在歸並操作上的壹種有效的排序算法。該算法是采用分治法(Divide and Conquer)的壹個非常典型的應用。

基本思想

歸並排序算法是將兩個(或兩個以上)有序表合並成壹個新的有序表,即把待排序序列分為若幹個子序列,每個子序列是有序的。然後再把有序子序列合並為整體有序序列。

算法思想

自上而下遞歸法(假如序列***有n個元素)

① 將序列每相鄰兩個數字進行歸並操作,形成 floor(n/2)個序列,排序後每個序列包含兩個元素;

② 將上述序列再次歸並,形成 floor(n/4)個序列,每個序列包含四個元素;

③ 重復步驟②,直到所有元素排序完畢。

自下而上叠代法

① 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合並後的序列;

② 設定兩個指針,最初位置分別為兩個已經排序序列的起始位置;

③ 比較兩個指針所指向的元素,選擇相對小的元素放入到合並空間,並移動指針到下壹位置;

④ 重復步驟③直到某壹指針達到序列尾;

⑤ 將另壹序列剩下的所有元素直接復制到合並序列尾。

排序演示

算法實現

八、基數排序

介紹

基數排序(Radix Sort)屬於“分配式排序”,又稱為“桶子法”。

基數排序法是屬於穩定性的排序,其時間復雜度為O (nlog(r)m) ,其中 r 為采取的基數,而m為堆數。

在某些時候,基數排序法的效率高於其他的穩定性排序法。

基本思想

將所有待比較數值(正整數)統壹為同樣的數位長度,數位較短的數前面補零。然後,從最低位開始,依次進行壹次排序。這樣從最低位排序壹直到最高位排序完成以後,數列就變成壹個有序序列。

基數排序按照優先從高位或低位來排序有兩種實現方案:

MSD(Most significant digital) 從最左側高位開始進行排序。先按k1排序分組, 同壹組中記錄, 關鍵碼k1相等,再對各組按k2排序分成子組, 之後, 對後面的關鍵碼繼續這樣的排序分組, 直到按最次位關鍵碼kd對各子組排序後. 再將各組連接起來,便得到壹個有序序列。MSD方式適用於位數多的序列。

LSD (Least significant digital)從最右側低位開始進行排序。先從kd開始排序,再對kd-1進行排序,依次重復,直到對k1排序後便得到壹個有序序列。LSD方式適用於位數少的序列。

排序效果

算法實現

九、總結

各種排序的穩定性、時間復雜度、空間復雜度的總結:

平方階O(n?)排序:各類簡單排序:直接插入、直接選擇和冒泡排序;

從時間復雜度來說:

線性對數階O(nlog?n)排序:快速排序、堆排序和歸並排序;

O(n1+§))排序,§是介於0和1之間的常數:希爾排序 ;

線性階O(n)排序:基數排序,此外還有桶、箱排序。