從圖中我們可以看到:
left指標,right指標,base參照數。
其實思想是蠻簡單的,就是通過第一遍的遍歷(讓left和right指標重合)來找到陣列的切割點。
第一步:首先我們從陣列的left位置取出該數(20)作為基準(base)參照物。
第二步:從陣列的right位置向前找,一直找到比(base)小的數,
如果找到,將此數賦給left位置(也就是將10賦給20),
此時陣列為:10,40,50,10,60,
left和right指標分別為前後的10。
第三步:從陣列的left位置向後找,一直找到比(base)大的數,
如果找到,將此數賦給right的位置(也就是40賦給10),
此時陣列為:10,40,50,40,60,
left和right指標分別為前後的40。
第四步:重複「第二,第三「步驟,直到left和right指標重合,
最後將(base)插入到40的位置,
此時陣列值為: 10,20,50,40,60,至此完成一次排序。
第五步:此時20已經潛入到陣列的內部,20的左側一組數都比20小,20的右側作為一組數都比20大,
以20為切入點對左右兩邊數按照"第一,第二,第三,第四"步驟進行,最終快排大功告成。
1、演算法思想
快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。
(1) 分治法的基本思想
分治法的基本思想是:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。
(2)快速排序的基本思想
設當前待排序的無序區為r[low..high],利用分治法可將快速排序的基本思想描述為:
①分解:
在r[low..high]中任選乙個記錄作為基準(pivot),以此基準將當前無序區劃分為左、右兩個較小的子區間r[low..pivotpos-1)和r[pivotpos+1..high],並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄(不妨記為pivot)的關鍵字pivot.key,右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,而基準記錄pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。
注意:劃分的關鍵是要求出基準記錄所在的位置pivotpos。劃分的結果可以簡單地表示為(注意pivot=r[pivotpos]):
r[low..pivotpos-1].keys≤r[pivotpos].key≤r[pivotpos+1..high].keys
其中low≤pivotpos≤high。
②求解:
通過遞迴呼叫快速排序對左、右子區間r[low..pivotpos-1]和r[pivotpos+1..high]快速排序。
③組合:
因為當"求解"步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什麼,可看作是空操作。
現在**奉上:
void quicksort(int left,int right)
while(i!=j)
while(ipython
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''@author: willard
'''def sub_sort(array,low,high):
key = array[low]
while low < high:
while low < high and array[high] >= key:
high -= 1
while low < high and array[high] < key:
'''因為key已經儲存了low位置的值,所以這裡先儲存arr[high],然後將low+1的值
儲存在high中,其實基本原則就是除了key的值,不要漏掉原有的arr值'''
array[low] = array[high]
low += 1
array[high] = array[low]
array[low] = key
return low
def quick_sort1(array,low,high):
if low < high:
key_index = sub_sort(array,low,high)
quick_sort1(array,low,key_index)
quick_sort1(array,key_index+1,high)
if __name__ == '__main__':
#array = [8,10,9,6,4,16,5,13,26,18,2,45,34,23,1,7,3]
array1 = [2,1]
print (array1)
quick_sort1(array1,0,len(array1)-1)
print (array1)
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...
排序演算法 快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 1.從數列中挑出乙個元素,稱為 基準 pivot 2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分...