python 快排以及多種優(yōu)化

def quick_sort(alist, start, end):
    """快速排序"""

    # 遞歸的退出條件
    if start >= end:
        return

    # 設定起始元素為要尋找位置的基準元素
    mid = alist[start]

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

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

    while low < high:
        # 如果low與high未重合,high指向的元素不比基準元素小,則high向左移動
        while low < high and alist[high] >= mid:
            high -= 1
        # 將high指向的元素放到low的位置上
        alist[low] = alist[high]

        # 如果low與high未重合,low指向的元素比基準元素小,則low向右移動
        while low < high and alist[low] < mid:
            low += 1
        # 將low指向的元素放到high的位置上
        alist[high] = alist[low]

    # 退出循環(huán)后,low與high重合,此時所指位置為基準元素的正確位置
    # 將基準元素放到該位置
    alist[low] = mid

    # 對基準元素左邊的子序列進行快速排序
    quick_sort(alist, start, low-1)

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


alist = [54,26,93,17,77,31,44,55,20]
quick_sort(alist,0,len(alist)-1)
print(alist)    

優(yōu)化1:基準元素不再選擇第一個元素,而是隨機選擇一個,這樣避免了有序數(shù)組,時間復雜度最壞為log(n2) 的情況

優(yōu)化2:三路快拍,把和基準元素相等的元素放在中間,比他小的在左邊,大的在右邊。這樣避免了重復元素過多的情況

Snip20171120_17.png
import random


def quicksort(arr, left, right):
    # 只有l(wèi)eft < right 排序
    if left >=right:
        return 
    #在列表里隨機選一個數(shù)來作為基準元素
    random_index = random.randint(left, right)
    #把基準元素和第一個元素交換
    arr[left], arr[random_index] = arr[random_index], arr[left]
    pivot = arr[left]
    #定義lt:小于v部分元素 的下標,初始是空的,因為arr[left]是基準元素
    lt = left # arr[left+1...lt] < v
    #gt 大于v 部分開始的下標,初始為空
    gt = right + 1 # arr[gt...right] > v
    i = left + 1 # arr[lt+1...i] == v
    #終止條件:下標i 和gt 遇到一起,說明都排完了
    while i < gt:
        if arr[i] < pivot:
            arr[i], arr[lt+1] = arr[lt+1], arr[i]
            lt += 1
            i += 1
        elif arr[i] > pivot:
            arr[i], arr[gt-1] = arr[gt-1], arr[i]
            gt -= 1
        else:
            i += 1
     #最后把第一個元素(基準元素)放到等于v的部分
    arr[left], arr[lt] = arr[lt], arr[left]
    #遞歸排序
    quicksort(arr, left, lt-1)
    quicksort(arr, gt, right)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 一、直接插入排序 直接插入排序(Insertion Sort)的基本思想是:每次將一個待排序的元素記錄,按其關鍵字...
    kevin16929閱讀 661評論 0 0
  • 寫于2015年6月18日,可能已過時,請謹慎參考。所有示例代碼未經完整測試,僅示意思路。 在javascript中...
    周驊閱讀 318評論 0 0
  • Redis的內存優(yōu)化 聲明:本文內容來自《Redis開發(fā)與運維》一書第八章,如轉載請聲明。 Redis所有的數(shù)據都...
    meng_philip123閱讀 19,082評論 2 29
  • 概述 排序有內部排序和外部排序,內部排序是數(shù)據記錄在內存中進行排序,而外部排序是因排序的數(shù)據很大,一次不能容納全部...
    蟻前閱讀 5,308評論 0 52
  • 你不懂我,我不怪你-莫言 每個人都有一個死角, 自己走不出來,別人也闖不進去。 我把最深沉的秘密放在那里。 你不懂...
    將暮未暮1996閱讀 147評論 0 0

友情鏈接更多精彩內容