首先想要實現快速排序演算法,需要了解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 利用代入法可以求...