Python實現快速排序演算法
阿新 • • 發佈:2018-12-10
快速排序也是使用了分治思想的排序方法,但與歸併排序不一樣的是“分”的時候的依據。歸併排序“分”的依據是對半分,不管大小,而快速排序則是選定陣列中的一個值,以這個值為依據,將陣列分為三個部分:小於這個值的部分,大於等於這個值的部分,這個值。這樣就以選定的點將陣列分為兩部分(小於值的部分,大於等於值的部分),然後再通過迭代對這兩個部分分別繼續執行這樣一個“分”的過程,直至最後只剩下1-2個元素,即無法再“分”時,此時陣列也排序完成。 下面以圖示的方法展示一下第一次“分”的過程。 首先給出要排序的陣列,和分別為陣列的首尾下標。利用和這兩個數進行迭代。令。 迭代過程中分成了這樣幾個部分: 所在的位置是的最新的一個值,在“分”的最後,將返回,即用來比較的值的位置,以供下次迭代。 具體的python程式碼實現如下。
#將陣列分為兩部分 def partition(l0,sta,end): i=sta-1 for j in range(sta,end): if l0[j]<l0[end]: i=i+1 #如果j所在的位置的值小於end,則i往前進一步,並與j的值交換,即將一個新的值加入到<end的區域 x=l0[i] l0[i]=l0[j] l0[j]=x #一次“分”結束,將用於比較的值放在應該在的地方(兩個區域的中間) i=i+1 x=l0[i] l0[i]=l0[end] l0[end]=x return i def quicksort(l0,sta,end): #當至少存在兩個元素時,才進行接下來的分解 if sta<end: mid=partition(l0,sta,end) #分成的sta—mid-1,mid+1—end兩個區域接著進行分解、迭代 quicksort(l0,sta,mid-1) quicksort(l0,mid+1,end) return l0
快速排序的最壞情況,即每次分解時都極其不平衡,分解為個元素和個元素,這樣分解操作的時間複雜度為,而對大小為的陣列進行迭代會直接返回,時間複雜度可以忽略。這樣演算法執行時間的遞迴式為 解為 而最好的情況則是每次都對半分,這樣算出的時間複雜度為 而即使是每次的劃分達到這樣一個很不平衡的狀態,最終算出的時間複雜度也是,事實上,即使是也是這樣的時間複雜度。(結論和推導均來自《演算法導論》) 所以快速排序法的期望時間複雜度為,是一個優秀的排序演算法。