快速排序的原理是基於分治策略,設定乙個基準線(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 演算法穩定性 不穩定 原理 採用分治思想,在待排序的序列中選取乙個值作為乙個基準值,按照這個基準值得大小將這個序列劃分成兩個子串行,基準值會在...