Python實現快速排序

來源:互聯網
上載者:User

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]])

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.