快速排序(含圖片演示+python程式碼)
阿新 • • 發佈:2021-05-17
快速排序(含圖片演示+python程式碼)
由於最近在做快排相關的題,因此特地整理了一下,並且配了一些圖片演示,一來是為了自己印象深刻,二來也方便大家理解。
基本思想:
1.先從數列中取出一個數作為基準數。
2.分割槽過程,將比這個基準數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對基準數的左右區間重複第二步,直到各區間只有一個數。
看文字會比較難理解,下面直接上圖,大家可以看完圖再回過頭來理解文字。
第一步,選定基準數
如圖所示,有這樣一個無序陣列arr,我們選定第一個數,即arr[0]為基準值,我們將arr[0]存入變數base中,我們可以想象在原來arr[0]的位置挖了一個坑:
第二步,比較過程
①令i=最左邊元素索引,j=最右邊元素索引。
②從右往左找小於base的元素:將j逐步向左移動,查詢第一個小於base的元素。顯然,arr[5]<base,因此將arr[5]的值插入原來的坑arr[0]中,這樣就在arr[5]上形成了新的坑,由於arr[0]已經更新,因此i沒有必要繼續指著arr[0]了,所以i+1:
③從左往右找大於base的元素:將i逐步向右移動,查詢第一個大於base的元素。
arr[1]<base,i++
arr[2]<base,i++
arr[3]>base,因此將arr[3]插入原來的坑arr[5]中,這樣就在arr[3]上形成了新的坑,由於arr[3]已經更新,因此j沒有必要繼續指著arr[5]了,所以j-1:
由於i<j,因此我們繼續重複②③,直到i>=j時停止。
重複②:從右往左找小於base的元素:將j逐步向左移動,查詢第一個小於base的元素。顯然,arr[4]<base,因此將arr[4]插入原來的坑arr[3]中,這樣就在arr[4]上形成了新的坑,由於arr[3]已經更新,因此i沒有必要繼續指著arr[3]了,所以i+1:
④中止比較:由於此時i>=j,因此比較中止,將base插入到坑arr[4]中,此時可以發現,arr[4]左邊都是小於base的元素,右邊都是大於base的元素:
程式碼如下:
1.# 輸入陣列,最左元素索引,最右元素索引 2.def adjustArr(arr,l,r): 3. i = l 4. j = r 5. # 以最左元素作為比較基準 6. x = arr[i] 7. while i < j : 8. # 從右向左找比x小的數來填arr[i] 9. while i < j and arr[j] >= x: 10. j = j - 1 11. if i < j : 12. # 將arr[j]替換arr[i],arr[j]變成新的坑 13. arr[i] = arr[j] 14. i = i + 1 15. # 從左向右找比x大的數來填arr[i] 16. while i < j and arr[i] < x: 17. i = i + 1 18. if i < j : 19. # 將arr[i]替換arr[j],arr[i]變成新的坑 20. arr[j] = arr[i] 21. j = j - 1 22. # 退出時,i等於j。將x填到這個坑中。 23. arr[i] = x 24. 25. return i
接下來,我們需要把基準值左右兩邊的陣列單獨拎出來,再次執行上述①-④的過程。例如,左邊陣列是[16,56,43,27],我們還是選定16為基準值來進行快排,而右邊陣列為[95],只有一個元素,不用再排了。這就是分治思想。
分治部分程式碼如下:
1.def quickSort(arr,l,r):
2. if l < r :
3. i = adjustArr(arr,l,r)
4. quickSort(arr,l,i-1)
5. quickSort(arr,i+1,r)
測試結果:
1.# 輸入待排序陣列
2.arr = [55,23,5,78,13,45,69,80,17]
3.l = 0
4.r = len(arr) - 1
5.quickSort(arr,l,r)
6.arr
以上就是快排的全部內容了~~