秋招過去好久了,閒來無事,突然想到乙個問題,就是他們總喜歡問快排,當然快排應該是比較簡單的啦。當你實現的時候,他們大多會問,非遞迴的實現,這個就會難到一部分同學哈,我也是。現在總結一下。
快速排序遞迴實現:
先看一下,這個《資料結構教程》李春葆 第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 次比較 都是後半部分元素比前半部大 而不同之處就在於氣泡...