快速排序也是面試中經常問到的演算法,人人都應該掌握。快速排序是對氣泡排序的改進,它的基本思想是:採用分而治之的思想,選取乙個基準,一趟排序後把資料分成兩部分,一部分都比基準小,另一部分都比基準點大,然後再對這兩部分分別進行上述的操作,直到整個序列有序。快速排序因為資料的交換是跳躍的,所以速度比只和相鄰資料交換的氣泡排序要快,平均時間複雜度為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.就像選擇排序每排一次序排好最小 大值一樣,快速排序每排一次序 會 將中軸值 預設取陣列第...