基礎演算法二 快速排序

2021-09-12 17:14:44 字數 1818 閱讀 3799

快速排序也是面試中經常問到的演算法,人人都應該掌握。快速排序是對氣泡排序的改進,它的基本思想是:採用分而治之的思想,選取乙個基準,一趟排序後把資料分成兩部分,一部分都比基準小,另一部分都比基準點大,然後再對這兩部分分別進行上述的操作,直到整個序列有序。快速排序因為資料的交換是跳躍的,所以速度比只和相鄰資料交換的氣泡排序要快,平均時間複雜度為o(nlogn)。

該演算法主要有兩種實現方法:遞迴和非遞迴。

1.遞迴的實現方法:

def quick_sort(array):

if len(array) < 2:

return array

basevalue = array[0]

less =

great =

equal = [basevalue]

for i in array[1:]:

if i < basevalue:

elif i > basevalue:

else:

return quick_sort(less) + equal + quick_sort(great)

if __name__ == '__main__':

array = [5, 8, 7, 6, 5, 4, 0, 3, 2, 1, 9]

sorted = quick_sort(array)

print(sorted)

結果為:

[0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]

2.非遞迴的實現利用了棧來完成,使用棧來記錄每次分治資料的邊界,將待處理資料的右邊界索引、左邊邊界索引入棧,判斷棧是否為空,如果不為空,取出兩個棧元素,處理該兩個棧元素範圍內的資料:資料進行分割槽,使左邊分割槽都小於等於基準值,右邊分割槽都大於等於基準值,返回基準值的索引index。判斷index-1>左邊界索引,將index和左邊界索引入棧。判斷index+1《右邊界索引,將右邊界索引和index入棧。然後重複這個過程,**如下:

def quick_sort_stack(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:

def partition(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]

arr[start] = pivot

return start

if __name__ == '__main__':

array = [5, 8, 7, 6, 5, 4, 0, 3, 2, 1, 9]

quick_sort_stack(array)

print(array)

結果為:

[0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]

java 演算法基礎之二快速排序演算法

所謂的快速排序的思想就是,首先把陣列的第乙個數拿出來做為乙個key,在前後分別設定乙個i,j做為標識,然後拿這個key對這個陣列從後面往前遍歷,及j 直到找到第乙個小於這個key的那個數,然後交換這兩個值,交換完成後,我們拿著這個key要從i往後遍歷了,及i 一直迴圈到i j結束,當這裡結束後,我們...

基礎排序演算法 快速排序

快速排序大家應該都知道,快速排序是一種不穩定的演算法,運氣差可以降速降到冒泡的速度,運氣好能快到比歸併還快的速度。首先,快速排序需要選擇乙個x,這個數很多人稱為基準。剛開始的時候選擇 a 0 當x,讓i l,j r 剛開始的時候l和r分別為最左邊和最右邊。1 讓j減小,直到遇到 i 或者找到乙個小於...

演算法基礎 快速排序

要求 10分鐘內寫出快排!之前筆試用到排序演算法,總是想用快排但是又不能在規定時間寫出來,歸根到底還是快排的邏輯步驟沒有搞清,所以才導致每次失敗!徹底搞清快排動作邏輯,這樣即使長時間不用也能臨時寫出來!思路 1.就像選擇排序每排一次序排好最小 大值一樣,快速排序每排一次序 會 將中軸值 預設取陣列第...