Python四大流行排序演算法詳解--快速排序-氣泡排序-選擇排序-插入排序。
就作者而言使用Python經常用到的排序演算法就是快速排序、氣泡排序、選擇排序以及插入排序
就時間複雜度而言,快速排序是高階排序,查詢快速,時間複雜度為nlgn
而氣泡排序、選擇排序、插入排序則是比較低階的查詢演算法,時間複雜度為n**2
下面我們來看快速排序:
快速排序的思想是:
首先任意選取一個數據(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。 時間複雜度:O(nlgn)
解析:
首先介紹運用的技術:遞迴函式、列表生成式
1.首先向函式中傳入一個要排序的列表
2.判斷列表中的資料,如果是一個空列表或者列表中只有一個元素則返回原列表
3.然後應用列表生成式生成符合條件的(先隨機生成一個數,判斷列表中大於這個數的借用列表生成式生成小列表,繼續放到函式中遞迴,直到分成只有兩數比較之後的小列表)列表,然後拼接到一塊形成一個完整的列表返回
下面來看氣泡排序
氣泡排序是基礎的排序方法,相信只要是計算機專業的學生都學過這個氣泡排序,現在我就再聊聊吧
先來聊聊氣泡排序的思想吧
氣泡排序其實就是兩兩比對,即第一個和第二個比,第二個和第三個比......如果前面的比後面的大就交換位置。這樣一輪比對下來最大的數就會排到最後面了,然後第二輪、第三輪......對比到最後最小的數就會排到最前面.....
下面來看看程式碼:
程式碼解析:
1.第一個for迴圈控制的是對比多少輪,因為大最後一輪的時候其實都已經排序完畢了,不需要再排了,所以只需要排len(List)-1次。
2.第二個for迴圈控制的是兩兩對比的次數,因為第一行固定要對比len(List)-1次,而第二次的時候最後一個已經固定為最大,所以第二次只需要對比len(List)-1-1次,同理第三次為len(List)-1-2次......
3. 然後對控制對比次數的j迴圈進行對比。如果前面的大於後面則進行交,最後的到排序完成的列表,但是運算複雜,時間複雜度高
再來聊聊選擇排序
其實選擇排序和氣泡排序很相似,時間複雜度相同。只是選擇排序是定死第一個數,用這個數與剩餘的每個數進行對比,這樣最後就會得到最小的數房子第一個位置,第二輪定死為第二個,與剩下的再進行對比.....最後最大的就會放到最後,排序完成
用專業術語就是:
選擇排序比較好理解,好像是在一堆大小不一的球中進行選擇(以從小到大,先選最小球為例): 1. 選擇一個基準球 2. 將基準球和餘下的球進行一一比較,如果比基準球小,則進行交換 3. 第一輪過後獲得最小的球 4. 在挑一個基準球,執行相同的動作得到次小的球 5. 繼續執行4,直到排序好 時間複雜度:O(n^2). 需要進行的比較次數為第一輪 n-1,n-2....1, 總的比較次數為 n*(n-1)/2
下面來看看程式碼實現:
程式碼解析:
1.第一個for迴圈仍然控制進行對比的輪數,到最後一組的時候其實以及排序完成,所有不用再來一輪,最後的對比輪數為len(List)-1
2. 第二個for迴圈是控制對比的次數,由於每次定死一個,而且第一輪第一個固定最小,第二輪第一個第二個固定......所有對比的區間應該定為[i+1, len(List)-1]
3.因為每次對比都是定死前面的,第一輪定死第一個,第二輪第二個與後面對比,第三輪第三個......,所以應該定死輪數i代表的那個數,與後面每個j進行對比。即判斷 List[i]是否大於List[j],然後進行交換
最後我們再來聊聊插入排序演算法
插入排序演算法和冒泡、選擇排序相同,都是低階演算法,時間複雜度相同,都很高
插入排序原理很簡單,和氣泡排序極為相似,不過它是從後面向前對比,它所插入的必須是一個有序的,它與它前面的所有數一個一個的對比,知道找到比他小的就停止對比
有一個已經有序的資料序列,要求在這個已經排好的資料序列中插入一個數,但要求插入後此資料序列仍然有序 基本思想為:每步將一個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。 插入排序就是用一個數與一個已排好序的序列進行比對,從右向左進行。 例:5與3進行比較,5>3,將5與3不進行交換。l=[3,5], 此時再進行排序。4 < 5 l=[3,4,5] 3<4不進行交換,l=[3,4,5]
來看看實現程式碼把:
程式碼解析:
1. 第一個迴圈仍然是判斷對比的輪數
2. 第二個for迴圈是形成第一個迴圈數為基準形成的反序列表,如當i=5時,形成列表[5, 4, 3, 2, 1],然後用來判斷對比的次數
3. 然後用當前的數與前一個數進行對比,如果小於前一個數的話就進行交換,如果找到前一個數比自己小就停止交換
以上就是作者對四大常用排序演算法的總結,如果對大家有用的話點個贊哦!!!