快速排序的python多種實現

2021-09-30 11:35:16 字數 2435 閱讀 4603

特別是python能用一句話實現快速排序。

快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。

(1) 分治法的基本思想

分治法的基本思想是:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

(2)快速排序的基本思想

設當前待排序的無序區為r[low..high],利用分治法可將快速排序的基本思想描述為:

在r[low..high]中任選乙個記錄作為基準(pivot),以此基準將當前無序區劃分為左、右兩個較小的子區間r[low..pivotpos-1)和r[pivotpos+1..high],並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄(不妨記為pivot)的關鍵字pivot.key,右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,而基準記錄pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。

注意:劃分的關鍵是要求出基準記錄所在的位置pivotpos。劃分的結果可以簡單地表示為(注意pivot=r[pivotpos]):

r[low..pivotpos-1].keys≤r[pivotpos].key≤r[pivotpos+1..high].keys

其中low≤pivotpos≤high。

通過遞迴呼叫快速排序對左、右子區間r[low..pivotpos-1]和r[pivotpos+1..high]快速排序。

因為當"求解"步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什麼,可看作是空操作。

#!/usr/bin/env python

#coding:utf-8

#方法1

def quicksort(arr):

less =

pivotlist =

more =

if len(arr) <= 1:

return arr

else:

pivot = arr[0] #將第乙個值做為基準

for i in arr:

if i < pivot:

elif i > pivot:

else:

less = quicksort(less) #得到第一輪分組之後,繼續將分組進行下去。

more = quicksort(more)

return less + pivotlist + more

#方法2

#將方法1寫的更緊湊,彰顯python特點

def qsort(l):

return (qsort([y for y in l[1:] if y < l[0]]) + l[:1] + qsort([y for y in l[1:] if y >= l[0]])) if len(l) > 1 else l

#方法3

#基本思想同上,只是寫法上又有所變化

def qsort(list):

if not list:

return

else:

pivot = list[0]

less = [x for x in list if x < pivot]

more = [x for x in list[1:] if x >= pivot]

return qsort(less) + [pivot] + qsort(more)

#方法4

from random import *

def qsort(a):

if len(a) <= 1:

return a

else:

q = choice(a) #基準的選擇不同於前,是從陣列中任意選擇乙個值做為基準

return qsort([elem for elem in a if elem < q]) + [q] * a.count(q) + qsort([elem for elem in a if elem > q])

#方法5

#這個最狠了,一句話搞定快速排序,瞠目結舌吧。

qs = lambda xs : ( (len(xs) <= 1 and [xs]) or [ qs( [x for x in xs[1:] if x < xs[0]] ) + [xs[0]] + qs( [x for x in xs[1:] if x >= xs[0]] ) ] )[0]

if __name__=="__main__":

a = [4, 65, 2, -31, 0, 99, 83, 782, 1]

print quicksort(a)

print qsort(a)

print qs(a)

列為看官注意方法5了嗎?一句話搞定。哈哈哈。所有有乙個朋友在自己的t恤上寫著「生命有限,我用python」。

快速排序的多種思路實現

快速排序的多種思路實現 兩邊想中間靠攏 兩邊想中間靠攏,當a left key時,兩者交換 int partsortbothsize int a,int left,int right if begin if a begin a right return right 挖坑法 挖坑法left right...

快速排序的多種實現(一)

原始快排,嘻嘻!第一趟,flag arr 0 len arr.length,i 1,j len 1 從arr j 開始,找到第乙個小於flag的陣列元素 否 則另j 將其傳給arr 0 同時,記下j的位置 然後從arr i 開始,找到第乙個大於flag的陣列元素 否則另i 然後另arr j arr ...

快速排序的實現(python)

usr bin env python3 coding utf 8 import random 快速排序基礎 defpartition a,p,r x a r i p 1 j p while j r if a j x i 1 temp a i a i a j a j temp j 1 i 1 temp...