遞迴和非遞迴快速排序 Python實現

2021-08-18 14:45:33 字數 1240 閱讀 6278

快速排序的原理是基於分治策略,設定乙個基準線(pivot),將資料分為兩部分,不斷分治實現資料的排序

由實現原理容易得到遞迴**如下:

def

qsort

(arr):

ifnot len(arr):

return

else:

# 在這裡以第乙個元素為基準線

pivot = arr[0]

left = qsort([x for x in arr[1:] if x < pivot])

right = qsort([x for x in arr[1:] if x >= pivot])

return left+[pivot]+right

遞迴**思路清晰易懂,也容易寫出來,但效能相對較差,因為遞迴次數有限(遞迴的資料不斷壓入棧中,容易造成棧溢位)

非遞迴快排思路:

利用棧的思想,將需要繼續排序的首尾下標存入棧中,不斷彈棧進行分割槽操作

具體實現**如下:

def

quick_sort

(arr):

'''''

模擬棧操作實現非遞迴的快速排序

'''if len(arr) < 2:

return arr

stack =

while stack:

l = stack.pop()

r = stack.pop()

index = partition(arr, l, r)

if l < index - 1:

if r > index + 1:

defpartition

(arr, start, end):

# 分割槽操作,返回基準線下標

pivot = arr[start]

while start < end:

while start < end and arr[end] >= pivot:

end -= 1

arr[start] = arr[end]

while start < end and arr[start] <= pivot:

start += 1

arr[end] = arr[start]

# 此時start = end

arr[start] = pivot

return start

如有錯誤,歡迎指正和交流~

快速排序實現(遞迴 非遞迴)

首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分 int partition int a,int low,int high a low pivot 將樞軸值元素置於最終位置 return low 第乙個while迴圈裡的 還可以採用如下形式 while low high a high...

快速排序遞迴與非遞迴

快速排序思想 以公升序為例 在要排序的序列中選乙個基準,使它左邊的數都比它小,右邊的數都比它大。具體步驟 1 區間選乙個key,可以選區間右邊界的那個數 2 讓begin從區間左邊界開始往後找大於key的數,找到後停下來,再讓end從區間右邊界 1開始往前找小於key的數,找到後讓它和begin找的...

快速排序的遞迴非遞迴

快速排序 即一趟快速排序的過程,返回基準。基準 平分資料段 時間複雜度 好情況 無序的資料 o nlog2n 壞 有序 o n2 空間複雜度 o log2n 演算法穩定性 不穩定 原理 採用分治思想,在待排序的序列中選取乙個值作為乙個基準值,按照這個基準值得大小將這個序列劃分成兩個子串行,基準值會在...