八大排序算法(Python實現)

一 冒泡排序

算法描述

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


算法思路

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

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

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

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


時間複雜度

冒泡排序最好的時間複雜度O(n)

冒泡排序的最壞時間複雜度爲

O(n2)
冒泡排序總的平均時間複雜度爲
O(n2)


算法展現



算法實現


二 選擇排序

算法描述

是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。


算法思路

1.初始狀態:無序區爲R[1..n],有序區爲空;

2.第i趟排序(i=1,2,3…n-1)開始時,當前有序區和無序區分別爲R[1..i-1]和R(i..n)。該趟排序從當前無序區中-選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R[i+1..n)分別變爲記錄個數增加1個的新有序區和記錄個數減少1個的新無序區;

3.n-1趟結束,數組有序化了;


時間複雜度

最佳情況:T(n) = O(n2)

最差情況:T(n) = O(n2)

平均情況:T(n) = O(n2)


算法展現



算法實現



三 插入排序

算法描述

插入算法把要排序的數組分成兩部分:第一部分包含了這個數組的所有元素,但將最後一個元素除外(讓數組多一個空間纔有插入的位置),而第二部分就只包含這一個元素(即待插入元素)。在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中。


算法思路

1.設置監視哨r[0],將待插入紀錄的值賦值給r[0];
2.設置開始查找的位置j;
3.在數組中進行搜索,搜索中將第j個紀錄後移,直至r[0].key≥r[j].key爲止;
4.將r[0]插入r[j+1]的位置上。


算法展現


算法實現



四快速排序

算法描述

通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。


算法思路

1.設置兩個變量i、j,排序開始的時候:i=0,j=N-1;
2.以第一個數組元素作爲關鍵數據,賦值給key,即key=A[0];
3.從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小於key的值A[j],將A[j]和A[i]互換;
4.從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於key的A[i],將A[i]和A[j]互換;
5.重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於key,4中A[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到爲止。找到符合條件的值,進行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令循環結束)

時間複雜度

最佳情況:T(n) = O(nlogn)

最差情況:T(n) = O(n2)

平均情況:T(n) = O(nlogn)


算法展現


算法實現



五希爾排序

算法描述

希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。


算法思路

1.選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;

2.按增量序列個數k,對序列進行k 趟排序;

3.每趟排序,根據對應的增量ti,將待排序列分割成若干長度爲m 的子序列,分別對各子表進行直接插入排序。僅增量因子爲1 時,整個序列作爲一個表來處理,表長度即爲整個序列的長度;


時間複雜度

最佳情況:T(n) = O(nlog2 n)

最壞情況:T(n) = O(nlog2 n)

平均情況:T(n) = O(nlog n)


算法實現



六基數排序

數排序是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先級順序的,先按低優先級排序,再按高優先級排序。最後的次序就是高優先級高的在前,高優先級相同的低優先級高的在前。基數排序基於分別排序,分別收集,所以是穩定的。


算法思路

1.取得數組中的最大數,並取得位數;

2.arr爲原始數組,從最低位開始取每個位組成radix數組;

3.對radix進行計數排序(利用計數排序適用於小範圍數的特點;


時間複雜度

1.最佳情況:T(n) = O(n * k)

2.最差情況:T(n) = O(n * k)

3.平均情況:T(n) = O(n * k)


算法展現



算法實現



七堆排序

算法描述

堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種。可以利用數組的特點快速定位指定索引的元素。堆分爲大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即A[PARENT[i]] >= A[i]。在數組的非降序排序中,需要使用的就是大根堆,因爲根據大根堆的要求可知,最大的值一定在堆頂。


算法思路

1將初始待排序關鍵字序列(R1,R2….Rn)構建成大頂堆,此堆爲初始的無序區;

2將堆頂元素R[1]與最後一個元素R[n]交換,此時得到新的無序區(R1,R2,……Rn-1)和新的有序區(Rn),且滿足R[1,2…n-1]<=R[n];

3.由於交換後新的堆頂R[1]可能違反堆的性質,因此需要對當前無序區(R1,R2,……Rn-1)調整爲新堆,然後再次將R[1]與無序區最後一個元素交換,得到新的無序區(R1,R2….Rn-2)和新的有序區(Rn-1,Rn)。不斷重複此過程直到有序區的元素個數爲n-1,則整個排序過程完成。


時間複雜度

最佳情況:T(n) = O(nlogn)

最差情況:T(n) = O(nlogn)

平均情況:T(n) = O(nlogn)


算法展現


算法實現



八歸併排序

算法描述

歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲二路歸併。


算法思路

1.把長度爲n的輸入序列分成兩個長度爲n/2的子序列;

2.對這兩個子序列分別採用歸併排序;

3.將兩個排序好的子序列合併成一個最終的排序序列;


時間複雜度

最佳情況:T(n) = O(n)

最差情況:T(n) = O(nlogn)

平均情況:T(n) = O(nlogn)


算法展現



算法實現



算法動態圖片來源於網絡

參考資料:《百度百科》

參考資料:《數據結構與算法分析》


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章