快速排序算法_Python实现快速排序算法
排序是算法的入門知識,應用廣泛,且在程序員面試中,經常被提及,其中最常考的兩大排序算法為快速排序與歸并排序,本篇將使用Python語言來分析了解快速排序算法。
思想
快速排序是一種非常高效的排序算法,采用 “分而治之” 的思想,把大的拆分為小的,小的拆分為更小的。其原理是,對于給定的記錄,選擇一個基準數,通過一趟排序后,將原序列分為兩部分,使得前面的比后面的小,然后再依次對前后進行拆分進行快速排序,遞歸該過程,直到序列中所有記錄均有序。
步驟設當前待排序序列為R[low:high],其中low ≤ high,如果待排序的序列規模足夠小,則直接進行排序,否則分3步處理。
1、分解在R[low:high]中選定一個元素R[pivot],以此為標準將要排序的序列劃分為兩個序列R[low:pivot-1]與R[pivot+1:high],并使序列R[low:pivot-1]中所有元素的值小于等于R[pivot],序列R[pivot+1:high]所有的值大于R[pivot],此時基準元素以位于正確位置,它無需參加后續排序。
2、遞歸對于子序列R[low:pivot-1]與R[pivot+1:high],分別調用快速排序算法來進行排序。
3、合并由于對序列R[low:pivot-1]與R[pivot+1:high]的排序是原地進行的,所以R[low:pivot-1]與R[pivot+1:high]都已經排好序后,不需要進行任何計算,就已經排好序。
注:基準元素,一般來說選取有幾種方法
- 取第一個元素
- 取最后一個元素
- 取第中間位置元素
- 取第一個、最后一個、中間位置3者的中位數元素
假設當前排序為R[low:high],其中low ≤ high。
1:首先取序列第一個元素為基準元素pivot=R[low]。i=low,j=high。 2:從后向前掃描,找小于等于pivot的數,如果找到,R[i]與R[j]交換,i++。 3:從前往后掃描,找大于pivot的數,如果找到,R[i]與R[j]交換,j--。 4:重復2~3,直到i=j,返回該位置mid=i,該位置正好為pivot元素。 完成一趟排序后,以mid為界,將序列分為兩部分,左序列都比pivot小,有序列都比pivot大,然后再分別對這兩個子序列進行快速排序。
以序列(30,24,5,58,18,36,12,42,39)為例,進行演示
1、初始化,i=low,j=high,pivot=R[low]=30 2、從后往前找小于等于pivot的數,找到R[j]=12R[i]與R[j]交換,i++
3、從前往后找大于pivot的數,找到R[i]=58R[i]與R[j]交換,j--
4、從后往前找小于等于pivot的數,找到R[j]=18R[i]與R[j]交換,i++
5、從前往后找大于pivot的數,這時i=j,第一輪排序結束,返回i的位置,mid=i此時已mid為界,將原序列一分為二,左子序列為(12,24,5,18)元素都比pivot小,右子序列為(36,58,42,39)元素都比pivot大。然后在分別對兩個子序列進行快速排序,最后即可得到排序后的結果。
復雜度分析- 最好的時間復雜度為:O(nlogn)
分解:劃分函數需要掃描每個元素,每次掃描元素不超過n,時間復雜度為O(n) 解決子問題:在理想的情況下,每次劃分將問題分解為兩個規模為n/2的子問題,遞歸求解兩個規模的子問題。所需時間為2T(n/2) 合并:因為是原地排序,合并不需要時間復雜度 因此總運行時間為
T(n)={ O(1) , n=12T(n/2)+O(n) , n>1 }最終求解為最好的時間復雜度為O(nlogn)
- 最壞的時間復雜度為: O(n2)
最終求解為最好的時間復雜度為O(n2)
- 平均時間復雜度為:O(nlogn)
- 平均空間復雜度為:O(logn)
總結
以上是生活随笔為你收集整理的快速排序算法_Python实现快速排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript 高级程序设计_重读
- 下一篇: cstring判断包含字符串_Pytho