1. 程式人生 > 其它 >快速排序(含圖片演示+python程式碼)

快速排序(含圖片演示+python程式碼)

快速排序(含圖片演示+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

在這裡插入圖片描述
以上就是快排的全部內容了~~