在路上---學習篇(一)Python 數據結構和算法 (3) --快速排序


獨白:

  前幾天學的基本簡單排序算法,相對來說接受起來還是可以的,今天學的快速排序,視頻看了2遍加上自己的思考,才真正的研究明白。自己的編程思維在逐漸的形成,日后還需勤加練習。心得:越高級的算法,越是讓人難理解。為了追求算法時間的縮短,需要更多知識來進行支撐。

 


快速排序

快速排序(英語:Quicksort),又稱划分交換排序(partition-exchange sort),通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

步驟為:

  1. 從數列中挑出一個元素,稱為"基准"(pivot),
  2. 重新排序數列,所有元素比基准值小的擺放在基准前面,所有元素比基准值大的擺在基准的后面(相同的數可以到任一邊)。在這個分區結束之后,該基准就處於數列的中間位置。這個稱為分區(partition)操作。
  3. 遞歸地(recursive)把小於基准值元素的子數列和大於基准值元素的子數列排序。

遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個算法總會結束,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最后的位置去。

 

 

"""
快速排序
最優時間復雜度:O(nlogn)
最壞時間復雜度:O(n2)
穩定性:不穩定

"""
import time
import random


def quick_sort(list, star, end):
    # 遞歸的退出條件
    if star >= end:
        return

    # low為序列左邊的由左向右移動的游標
    low = star

    # high 為序列右邊的由右向左移動的游標
    high = end

    # 設定其實元素為要尋找位置的基准元素
    mid_value = list[star]

    while low < high:
        # 如果low 與high 未重合,high 指向的元素不比基准元素小,則high向左移
        while low < high and list[high] >= mid_value:
            high -= 1

        # 將high 指向的元素放到low 的位置上
        list[low] = list[high]

        # 如果low與high未重合,low指向的元素比基准元素小,low的向右移
        while high > low and list[low] < mid_value:
            low += 1

        # 將low指向的元素放到high的位置上
        list[high] = list[low]

    # 退出循環后,low 與high重合,此時所指位置為基准元素的正確位置
    # 循環退出時 將基准元素放到該位置
    list[low] = mid_value

    # 對基准元素的左邊的子序列進行快速排序
    quick_sort(list, star, low-1)

    # 對基准元素右邊的子序列進行快速排序
    quick_sort(list, low+1, end)


def new_num(lis):
    """隨機生成50個數加入列表中"""
    for i in range(50):
        j = random.randint(0,10000)
        lis.append(j)


if __name__ == '__main__':

    first_time = time.time()
    # 空列表
    lis = []

    # 隨機函數添加到列表中
    new_num(lis)

    # 列表排序
    quick_sort(lis, 0, len(lis)-1)

    print(lis)

    # 結束時間
    last_time = time.time()

    print("共用時%s" % (last_time - first_time))

 


免責聲明!

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



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