Python實現快速排序
快速排序採用了分治的思想,基本思想是選取數組中一個數為基準數(一般選擇數組中的第一個數),一次排序過程中,將比基準數小的都放在它左側,比基準數大的放在它的右側。經過這次排序後得到兩個數組和一個基準數,數組1中全部元素小於基準數,數組2中的全部元素大於基準數,然後對數組1,2分別進行同樣的排序(遞迴),最後直到剩下一個數字。
下面給出Python代碼實現
def partiton(li, low, high):
key = li[low]
while low < high:
while low < high and li[high] >= key:
high -= 1
if low < high:
li[low], li[high] = li[high], li[low]
while low < high and li[low] < key:
low += 1
if low < high:
li[high], li[low] = li[low], li[high]
return low
def quickSort(li, low, high):
if low >= high:
return
center = partiton(li, low, high)
quickSort(li, low, center - 1)
quickSort(li, center + 1, high)
關於實現:
快速排序的實現有很多種,這裡我給出了比較常規並且好理解的一種.低位,高位兩個指標從左右兩側相向遍曆list。當高位指標發現了小於基準數的元素時,便停止移動,此時開始移動低位指標,當低位指標發現了大於基準數的元素時,便停止移動,兩指標交換元素值,如此迴圈,直至兩指標相遇。
關於時間複雜度:
快速排序具體的已耗用時間和原始列表本身的排序狀態有很大關係,理論上快排的時間複雜度是(nlogn),但是如果運氣不好糟糕,比如說初始列表是[5,4,3,2,1],那麼根據上面的方法實現過程是什麼樣的呢,實現過程如下:
[5,4,3,2,1] -> [4,3,2,1,5] -> [3,2,1,4,5] -> [2,1,3,4,5] -> [1,2,3,4,5]
這樣的排序實現過程很眼熟,跟最簡單的冒泡排序的實現過程是完全相同的,所以說快排的最壞情況是冒泡排序,時間複雜度是(n2)
以上的實現較為通用,如果不使用python,而使用c++,java等其它程式設計語言實現,代碼結構不會相差太多。我想到了一種比較貼合python文法特點,並且能較好的展示快排思想的實現方法。不同點是該方法時間在層遞迴中需要遍曆2次列表,即複雜度為(2nlogn)
def qsort(lst): if not lst: return [] return qsort([i for i in lst[1:] if i < lst[0]]) + [lst[0]] + qsort([i for i in lst[1:] if i > lst[0]])