Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

算法 程序員 Python 數據結構 設計 java丶檸檬 2019-05-15

一、插入排序

介紹

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

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

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

步驟

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

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

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

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

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

⑥重複步驟2

排序演示


Python程序員一定要知道的八大排序算法!(附贈學習教程分享)


算法實現

Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

二、冒泡排序

介紹

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

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

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

原理

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

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

步驟

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

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

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

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

Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

算法實現:

Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

三、快速排序

介紹

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

基本思想

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

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

實現步驟

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

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

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

排序演示


Python程序員一定要知道的八大排序算法!(附贈學習教程分享)


算法實現

Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

四、希爾排序

介紹

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

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

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

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

基本思想

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

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

排序演示


Python程序員一定要知道的八大排序算法!(附贈學習教程分享)


算法實現

Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

五、選擇排序

介紹

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

基本思想

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

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

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

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

排序演示


Python程序員一定要知道的八大排序算法!(附贈學習教程分享)


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

算法實現

Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

六、堆排序

介紹

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

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

基本思想

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

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

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

排序演示


Python程序員一定要知道的八大排序算法!(附贈學習教程分享)


算法實現

Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

七、歸併排序

介紹

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

基本思想

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

算法思想

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

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

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

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

自下而上迭代法

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

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

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

④ 重複步驟③直到某一指針達到序列尾;

⑤ 將另一序列剩下的所有元素直接複製到合併序列尾。

排序演示

Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

算法實現

Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

八、基數排序

介紹

基數排序(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方式適用於位數少的序列。

排序效果


Python程序員一定要知道的八大排序算法!(附贈學習教程分享)


算法實現

Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

九、總結

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


Python程序員一定要知道的八大排序算法!(附贈學習教程分享)


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

從時間複雜度來說:

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

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

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

最後檸檬為大家準備了一些python的學習教程分享,希望可以幫助到大家。

Python程序員一定要知道的八大排序算法!(附贈學習教程分享)

獲取方式:請大家轉發+關注並私信小編關鍵詞:“資料”即可獲取。

相關推薦

推薦中...