從圖中我們可以看到:
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為切入點對左右兩邊數按照"第一,第二,第三,第四"步驟進行,最終快排大功告成。
right下標位置開始,向左邊遍歷,查詢不大於基準數的元素
5while left < right and nums[right] >=key:
6 right -= 1
7if left < right: #
找到小於準基數key的元素,然後交換nums[left],nums[right]
8 nums[left], nums[right] =nums[right], nums[left]
9else: #
left〉=right 跳出迴圈
10break11#
left下標位置開始,向右邊遍歷,查詢不小於基準數的元素
12while left < right and nums[left]
13 left += 1
14if left < right: #
找到比基準數大的元素,然後交換nums[left],nums[right]
15 nums[right],nums[left] =nums[left],nums[right]
16else: #
left〉=right 跳出迴圈
17break
18return left #
此時left==right 所以返回right也是可以的
1920
21def
quick_sort_standord(nums, left, right):
22if left
23 key_index =partion(nums, left, right)
24quick_sort_standord(nums, left, key_index)
25 quick_sort_standord(nums, key_index+1, right)
2627
28if
__name__ == '
__main__':
29 nums = [5, 6, 4, 2, 3, 1]
30print
(nums)
31 quick_sort_standord(nums, 0, len(nums)-1)
32print(nums)
4>
排序演算法4 快速排序
編寫乙份快速排序,完成對元素序列37,19,43,22,22,89,26,92按照從小到大順序排列。演算法思想 快速排序是氣泡排序演算法的改進,也屬於交換型別的排序演算法,它的基本思想描述如下 1 從第j個元素開始向前依次將每個元素與樞軸元素pivot比較。如果當前元素大於pivot,則比較前乙個元...
排序演算法 4 快速排序
快速排序法是對氣泡排序的一種改進,本來是要和氣泡排序寫在乙個文章裡的,不過前兩天剛開始在遞迴呼叫的時候沒有完全理解,昨天晚上google了一把發現原來自己理解錯了,我看的這個教材沒有寫清楚,今天早上除錯了一把終於成功。快速排序演算法的基本思想是 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部...
排序演算法 4 快速排序
快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 nlogn 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 nlogn 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實現出來。快速排序...