快速排序演算法,簡稱快排,是最實用的排序演算法,沒有之一,各大語言標準庫的排序函式也基本都是基於快排實現的。
快排基本思路:快速排序基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
一、使用遞迴的方式:
defpartition(l,left,right):
tmp=l[left]
while leftwhile leftand l[right]>=tmp:
right-=1l[left]=l[right]
while leftand l[left]<=tmp:
left+=1l[right]=l[left]
l[left]=tmp
return
left
defquick_sort(l,left,right):
if leftmid=partition(l,left,right)
quick_sort(l,left,mid-1)
quick_sort(l,mid+1,right)
l=[i for i in range(10000)]
random.shuffle(l)
(l)quick_sort(l,0,len(l)-1)
print(l)
二、使用非遞迴方式:用到的是棧的思想
其中需要考慮兩個問題:
1)棧裡邊儲存什麼?
2)迭代結束的條件是什麼?
- 棧裡邊儲存的是需要迭代的函式引數
- 結束條件也是跟需要迭代的引數有關。對於快速排序來說,
迭代的引數是陣列的上邊界low和下邊界high,迭代結束的條件是low == high。
defquick_sort(l, left, right):
if left >=right:
return
stack =
while
stack:
low =stack.pop(0)
high =stack.pop(0)
if high - low <=0:
continue
x =l[high]
i = low - 1
for j in
range(low, high):
if l[j] <=x:
i += 1l[i], l[j] =l[j], l[i]
l[i + 1], l[high] = l[high], l[i + 1]
stack.extend([low, i, i + 2, high])
快速排序遞迴與非遞迴
快速排序思想 以公升序為例 在要排序的序列中選乙個基準,使它左邊的數都比它小,右邊的數都比它大。具體步驟 1 區間選乙個key,可以選區間右邊界的那個數 2 讓begin從區間左邊界開始往後找大於key的數,找到後停下來,再讓end從區間右邊界 1開始往前找小於key的數,找到後讓它和begin找的...
快速排序 遞迴與非遞迴
1.以中間值作為基準數 void quick sort int q,int l,int r quick sort q,l,j quick sort q,j 1,r 2.以第乙個 最後乙個數作為基準數 int part sort int q,int l,int r q l q i q i temp r...
快速排序實現(遞迴 非遞迴)
首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分 int partition int a,int low,int high a low pivot 將樞軸值元素置於最終位置 return low 第乙個while迴圈裡的 還可以採用如下形式 while low high a high...