快速排序 遞迴與非遞迴

2022-02-04 09:01:25 字數 1404 閱讀 8300

快速排序演算法,簡稱快排,是最實用的排序演算法,沒有之一,各大語言標準庫的排序函式也基本都是基於快排實現的。

快排基本思路:快速排序基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

一、使用遞迴的方式:

def

partition(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)

print

(l)quick_sort(l,0,len(l)-1)

print(l)

二、使用非遞迴方式:用到的是棧的思想

其中需要考慮兩個問題:

1)棧裡邊儲存什麼?

2)迭代結束的條件是什麼?  

- 棧裡邊儲存的是需要迭代的函式引數

- 結束條件也是跟需要迭代的引數有關。對於快速排序來說,

迭代的引數是陣列的上邊界low和下邊界high,迭代結束的條件是low == high。

def

quick_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...