Python實現快速排序

2021-08-30 10:48:25 字數 2030 閱讀 4313

快速排序(英語:quicksort),又稱劃分交換排序(partition-exchange sort),簡稱快排,一種排序演算法,最早由東尼·霍爾提出。在平均狀況下,排序 n個專案要 o(n\log n)(大o符號)次比較。在最壞狀況下則需要 o(n^)} )次比較,但這種狀況並不常見。事實上,快速排序 theta (n\log n)通常明顯比其他演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地達成。

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。

步驟為:

從數列中挑出乙個元素,稱為「基準」(pivot),

重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割結束之後,該基準就處於數列的中間位置。這個稱為分割(partition)操作。

遞迴地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞迴到最底部時,數列的大小是零或一,也就是已經排序好了。這個演算法一定會結束,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。

本例採用原地排序版本。

簡單版本的缺點是,它需要 omega (n)的額外儲存空間,也就跟歸併排序一樣不好。額外需要的儲存器空間配置,在實際上的實現,也會極度影響速度和快取的效能。有乙個比較複雜使用原地(in-place)分割演算法的版本,且在好的基準選擇上,平均可以達到 o(\log n)空間的使用複雜度。

#quick sort

class quicksort:

def main(self,c):

assert type(c) == list or type(c) == tuple

list1 = list(c)

n = len(list1)

self.sort(list1,0,n)

return type(c)(list1)

def sort(self,c,left,right):

# print("c:",c,"l:",left ,"r:",right)

n = len(c)

if n < 2:

return c

if right - left < 2:

return c

de = self.quicksort(c,left,right-1)

self.sort(c,left,de)

self.sort(c,de+1,right)

return c

def quicksort(self,c,s,p):

r = p - 1

l = s

pivot = c[p]

# print("pivot:",pivot)

for i in range(s,p):

if c[i] >= pivot:

l = i

for j in range(r, s-1,-1):

if l == j:

c[l],c[p] = c[p],c[l]

# print(c)

return l

if c[j] <= pivot:

r = j

c[l],c[r] = c[r],c[l]

# print(c)

break

for j in range(r, s-1,-1):

if c[j] <= pivot:

c[l],c[j] = c[j],c[l]

return j

return p

#test

a = (9, 8, 6, 7, 4, 5, 3, 2, 1)

p = quicksort()

print(p.main(a))

python實現快速排序

快速排序的思想是任意選取要排序的list中的乙個數pivot,每次遞迴時將list按照 小於pivot的,pivot,大於pivot的 排序,再對小於和大於pivot部分分別快速排序。function quicksort list select a pivot foreach x in list i...

Python實現快速排序

快速排序的思路 numlist 6,8,1,4,3,9,5,4,11,2,2,15,6 1 設 keys 又稱為監視哨 等於 numlist 0 i等於0 j等於len numlist 1,即如下 numlist 6,8,1,4,3,9,5,4,11,2,2,15,6 keys 6 i 0 j2 1...

python實現快速排序

coding utf 8 實現對列表中的數進行快速排序 importrandom 隨機生成乙個有1000整數的列表 number random.randint 1 1000 foriinrange 1000 列印原始列表 printnumber 單個列表快速排序函式 返回一次排序後的列表和所選取基數...