快速排序 非遞迴實現總結

2021-09-10 02:49:48 字數 1916 閱讀 8889

秋招過去好久了,閒來無事,突然想到乙個問題,就是他們總喜歡問快排,當然快排應該是比較簡單的啦。當你實現的時候,他們大多會問,非遞迴的實現,這個就會難到一部分同學哈,我也是。現在總結一下。

快速排序遞迴實現:

先看一下,這個《資料結構教程》李春葆 第5版,提供的**(語言是c/c++),遞迴版的(簡練),原理就不解釋了:

void

quicksort

(rectype r[

],int s,int t)

r[i]

=tmp;

quicksort

(r,s,i-1)

;//對左區間遞迴排序

quicksort

(r,i+

1,t)

;//對右區間遞迴排序

}//遞迴出口:不需要任何操作

}

快速排序非遞迴的實現:

現在重點介紹一下非遞迴的方法,很顯然,需要借助棧來實現。具體原理如下:

(1)我們找乙個基準進行一趟快排,一般會產生兩個區間,這時,可以用乙個棧儲存這兩個區間(區間型別[start, end])。很顯然,現在已經歸位乙個元素了。

(2)迴圈判斷棧,出棧,也就是拿出乙個區間,繼續一趟快排,再歸位乙個元素然後再判斷產生的區間入棧

(3)直到棧為空,此時已經說明列表,排序好了。

python實現**:

# @time   :2019/01/21

# @author :liuyinxing

# 快速排序 棧

defquicksort

(arr)

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

iflen

(arr)

<2:

return arr

stack =

[0,len

(arr)-1

])# 初始化棧

while stack:

l, r = stack.pop(

)# 出棧乙個區間

index = partition(arr, l, r)

# 對分割槽進行一趟交換操作,並返回基準線下標

if l < index -1:

[l, index -1]

)# 當前趟,左區間入棧

if r > index +1:

[index +

1, r]

)# 當前趟,右區間入棧

defpartition

(arr, s, t)

:# 對分割槽進行一趟交換操作,並返回基準線下標

tmp = arr[s]

# 用區間的第1個記錄作為基準

while s < t:

while s < t and arr[t]

>= tmp: t -=

1 arr[s]

= arr[t]

while s < t and arr[s]

<= tmp: s +=

1 arr[t]

= arr[s]

# 此時s = t

arr[s]

= tmp

return s

if __name__ ==

'__main__'

: arr =[4

,5,0

,-2,

-3,1

] quicksort(arr)

print

(arr)

宣告:總結學習,有問題或不當之處,可以批評指正哦,謝謝。

[1] 非遞迴**參考鏈結

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

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

快速排序非遞迴實現

再來談談快速排序,遞迴實現與非遞迴實現。遞迴實現是基本的排序 非遞迴實現需要用stack來儲存 low,high 的排序對,一部分一部分的排序。直接上程式了 標頭檔案 quick test.h include include include include include include typed...

快速排序的非遞迴實現

首先說明一下快速排序是對氣泡排序的改進。為什麼這麼說呢?想一下氣泡排序,它把序列分成了兩部分,前半部分無序,後半部分公升序排列,並且後半部分的數都大於前半部的數。由此可得到快速排序和氣泡排序的一些共同點 都要經歷n趟排序 每趟排序要經歷o n 次比較 都是後半部分元素比前半部大 而不同之處就在於氣泡...