演算法 快速排序

2021-10-07 21:51:14 字數 2131 閱讀 1037

首先想要實現快速排序演算法,需要了解d&c(divide and conquer),也就是分而治之——一種著名的遞迴式問題解決方法。

使用d&c解決問題的過程包括兩個步驟:

找出基線條件,這種條件必須盡可能簡單。

不斷將問題分解(或者說縮小規模),指導符合基線條件。

快速排序,說白了就是給基準資料找其正確索引位置的過程.

如下圖所示,假設最開始的基準資料為陣列第乙個元素23,則首先用乙個臨時變數去儲存基準資料,即tmp=23;然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌:low指向起始位置,high指向末尾.

首先從後半部分開始,如果掃瞄到的值大於基準資料就讓high減1,如果發現有元素比該基準資料的值小(如上圖中18<=tmp),就將high位置的值賦值給low位置 ,結果如下:

然後開始從前往後掃瞄,如果掃瞄到的值小於基準資料就讓low加1,如果發現有元素大於基準資料的值(如上圖46=>tmp),就再將low位置的值賦值給high位置的值,指標移動並且資料交換後的結果如下:

然後再開始從後向前掃瞄,原理同上,發現上圖11<=tmp,則將low位置的值賦值給high位置的值,結果如下:

然後再開始從前往後遍歷,直到low=high結束迴圈,此時low或high的下標就是基準資料23在該陣列中的正確索引位置.如下圖所示.

這樣一遍走下來,可以很清楚的知道,其實快速排序的本質就是把基準數大的都放在基準數的右邊,把比基準數小的放在基準數的左邊,這樣就找到了該資料在陣列中的正確位置.

以後採用遞迴的方式分別對前半部分和後半部分排序,當前半部分和後半部分均有序時該陣列就自然有序了。

def

quick_sort

(arr=

, low=

0, high=0)

:# 遞迴條件

if low < high:

# 獲取基準值索引

index = get_index(arr, low, high)

# 分而治之,遞迴呼叫

quick_sort(arr,

0, index)

quick_sort(arr, index +

1, high)

# 基線條件

return arr

defget_index

(arr=

, low=

0, high=0)

:# 基準資料

temp = arr[low]

while low < high:

# 當隊尾的元素大於基準資料則隊尾下標向前移動一位

while low < high and temp <= arr[high]

: high -=

1# 當隊尾元素小於基準資料時,將隊尾元素的值賦值給low

arr[low]

= arr[high]

# 當隊首元素小於基準資料時,隊首下標向後移動一位

while low < high and arr[low]

<= temp:

low +=

1# 當隊首元素大於基準元素時,將隊首元素賦值給high

arr[high]

= arr[low]

# 跳出迴圈,將基準值賦值給low

arr[low]

= temp

# 返回基準值的index

return low

a =[3,

5,1,

13,6,

4,66,

3333,5

,7,23

,88,67

,4]print

(quick_sort(a,0,

len(a)-1

))

排序演算法 快速排序演算法

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...

演算法 排序演算法 快速排序

快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...

演算法設計 快速排序 隨機快速排序演算法

1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...