演算法學習 快速排序

2022-07-11 04:33:11 字數 1681 閱讀 4242

1、基本思想

取待排序陣列第乙個數作為參照數,建立left和right陣列,left儲存小於參照數的陣列集合,right儲存大於參照數的陣列集合,然後分別對left和right進行遞迴呼叫排序。

2、舉例

[11,2,3,43,23,5,6,9,10]

取任意的乙個數為基準數

temp =arr[0]

遍歷陣列,將比temp小的元素放在temp的左邊,比temp大的元素放在temp的右邊

left+【temp】+right

然後對左邊和右邊的元素分別進行quicksort

[3,21,1,999,9,2,2]

temp =3left = [1]

right = [21]

[1,3,21]

3、實現步驟

先從數列中取出乙個數作為基準數

分割槽過程,將比這個數大的數全放到它的右邊

將小於或等於它的數全放到它的左邊

再對左右區間重複第二步,直到各區間只有乙個數

4、實現方法1

def

quicksort(start_idx,end_idx,arr):

"""start_idx和end_idx確定排序區間

"""if start_idx>=end_idx:

return

arr low,high = start_idx,end_idx#

設定2個指標分別執行待排序陣列的起始和結束位置

temp=arr[low]#

設定基準數temp = arr[low]

while lowwhile low< high and arr[high]>=temp:#

從隊尾向前掃瞄,如果隊尾的數小於temp將隊尾的數放在low的位置

high-=1arr[low] =arr[high]

while lowand arr[low]#

從隊首向後掃瞄,如果隊首的數大於temp將隊首的數放在high的位置

low+=1arr[high] =arr[low]

arr[low] =temp

quicksort(start_idx,low,arr)

quicksort(low+1,end_idx,arr)

return arr

5、實現方法2

def

quicksort02(arr):

ifnot

arr:

return

arr temp =arr[0]

left = [x for x in arr[1:] if x<=temp]

right= [x for x in arr[1:] if x>temp]

return quicksort02(left)+[temp]+quicksort02(right)

print(quicksort02([1,45,23,28,33,22,1,-1]))

#結果 [-1, 1, 1, 22, 23, 28, 33, 45]

6、快速排序的時間複雜度和空間複雜度

• 時間複雜度:為o(nlogn)

• 空間複雜度:快速排序使用遞迴,遞迴使用棧,因此它的空間複雜度為o(logn)

• 穩定性:快速排序無法保證相等的元素的相對位置不變,因此它是不穩定的排序演算法

演算法學習 快速排序

快速排序 分治演算法 const int n 1e6 10 int a n a 待排序陣列,l 排序陣列的起始下標,r 排序陣列的結束下標 void quick sort int a,int l,int r 遞迴的終止條件 int x a l 選取排序的比較物件 int i l 1 設定排序的左指標...

排序演算法學習 快速排序

快速排序 作為氣泡排序的一種改進 通過設定乙個標誌值 通常為陣列第乙個元素pivot 一次快排將陣列分成兩個部分,一部分 公升序 前一部分 小於標誌值pivot,另一部分大於標誌值 公升序 後面部分 各部分內部可以是 通常也是 無序的。通過遞迴地呼叫這樣的排序,使得最終陣列所有的元素有序。一次具體的...

排序演算法學習 快速排序

今天演算法實驗重新學習了快速排序演算法,對此有了一些理解,把它記錄在此以供日後學習。如下為快速排序演算法的被呼叫部分。int get loc int arr int low,int high arr low arr i arr i temp return i 返回基準位置 演算法本質是從後往前與從前...