排序算法之快速排序的python實現


通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序。

快速排序算法的工作原理如下:

1. 從數列中挑出一個元素,稱為"基准"(pivot)。

2. 重新排序數列,所有元素比基准值小的擺放在基准前面,所有元素比基准值大的擺在基准的后面(相同的數可以到任一邊)。

3. 在這個分區結束之后,該基准就處於數列的中間位置。這個稱為分區(partition)操作。

4. 遞歸地(recursive)把小於基准值元素的子數列和大於基准值元素的子數列排序。

 

 

 

 

自我總結:快速排序的步驟就是首先將第一個數作為兩邊排序的數值,從第二個數開始對第一個數進行比較,如果大於第一個數將這個數放在第一個數的右邊,小於放左邊,依次進行比較並存放,最后將隊列分成三個部分: 左邊都比第一個數值小的數,第一個數值,右邊都比第一各值大的數。這樣就未完成了第一次排序的步驟。第二次是將前半部分的第一個值作為比較的”基數”,同第一次排序進行同樣的比較和存放,直到原隊列的第一個值之前的那個值。右邊和左邊做同樣的比較,排序,直到之后一個值。這樣依次進行遞歸,直到沒有可以在分為左右的,這樣就從小到大排序完成。

 

最優時間復雜度:O(nlogn)

n遍歷每個數是O(n),訪問每個數是O(logn),最終是O(nlogn)

可以轉換為求二叉樹深度的思想

最壞時間復雜度:O(n²)

穩定性:不穩定

優點:效率高,數據移動比較少,數據量越大,優勢越明顯

缺點:不穩定

下面為快速排序的代碼實現:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz"


# 快排
# first理解為第一個位置的索引,last是最后位置索引
def quick_sort(alist, first, last):
    # 遞歸終止條件
    if first >= last:
        return

    # 設置第一個元素為中間值
    mid_value = alist[first]
    # low指向
    low = first
    # high
    high = last
    # 只要low小於high就一直走
    while low < high:
        # high大於中間值,則進入循環
        while low < high and alist[high] >= mid_value:
            # high往左走
            high -= 1
        # 出循環后,說明high小於中間值,low指向該值
        alist[low] = alist[high]
        # high走完了,讓low走
        # low小於中間值,則進入循環
        while low < high and alist[low] < mid_value:
            # low向右走
            low += 1
        # 出循環后,說明low大於中間值,high指向該值
        alist[high] = alist[low]
    # 退出整個循環后,low和high相等
    # 將中間值放到中間位置
    alist[low] = mid_value
    # 遞歸
    # 先對左側快排
    quick_sort(alist, first, low - 1)
    # 對右側快排
    quick_sort(alist, low + 1, last)


if __name__ == '__main__':
    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(li)
    quick_sort(li, 0, len(li) - 1)
    print(li)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM