快速排序(Python實現)

2021-10-06 18:01:51 字數 2779 閱讀 2270

目錄

快速排序思路

邏輯演示 **

複雜度分析

快速排序又稱為分割交換排序法,是目前公認最佳的排序法,也是使用「分而治之"的方式,先會在資料中找到乙個虛擬的中間值,並按此中間值將所有打算排序的資料分為兩部分。其中小於中間值的資料放在一邊,而大於中間值的資料放在另一邊,再以同樣的方式分別處理左右兩邊的資料,直到排序完成為止。

以一串資料 72, 6, 57, 88, 60, 42,83, 73, 48, 85 為例進行快速排序,將資料按照數值由小到大的順序排序。

排序前:72

6578860

4283

7348

85我們假設虛擬的中間值總位於未排序部分的最左端,因此,第一次劃分的虛擬中間值x應該是72。即 x => 72。

我們將待排序數列的最左端下標變數為left = 0,最右端下標變數為right = length - 1 = 9。同時設定兩個游標 i = left, j = right。

因此排序前的數列如下:726

5788

6042

8373

4885

x, left, i

right, j

step1

我們將游標j緩慢的向左移動,找到乙個小於虛擬中間值的數字。顯然,當游標j移動到48時,此時48 < 72 = x,因此48就是我們要找的數。此時讓游標 i 對應位置的資料值填入48。486

5788

6042

8373

4885

left, i

jright

( x = 72 )

填入資料後,i 向右移動一格。486

5788

6042

8373

4885

leftij

right

接下來我們將游標 i 緩慢的向右移動,找到乙個大於虛擬中間值的數字。顯然,當游標 i 移動到88時,此時88 > 72 = x,因此88就是我們要找的數。此時讓游標 j 對應的位置的資料值填入88。486

5788

6042

8373

8885

leftij

right

( x = 72 )

填入資料後,j 向左移動一格。486

5788

6042

8373

8885

leftij

right

step2

經過一輪移動後,並沒有完全將虛擬中間值72把數列分開。因為此時兩個游標並沒有遍歷完全部資料。

我們繼續將游標 j 緩慢的向左移動,重複上面的規則,找到乙個小於虛擬中間值的數字。顯然,當游標 j 移動到42時,此時 42 < 72 = x,因此42就是我們要找的數。此時讓游標 i 對應位置的資料值填入42。486

5742

6042

8373

8885

leftij

right

填入資料後,i 向右移動一格。486

5742

6042

8373

8885

leftij

right

我們繼續將 i 緩慢向右移動,來尋找乙個大於虛擬中間值的數字。當 i 再次向右移動的時候,我們發現此時 i 和 j 對應的下標重疊了。也就是說,i 左邊的數字沒有大於虛擬中間值的數字,而 j 右邊的數字沒有小於虛擬中間值的數字,此時 i 和 j 交匯的點就是本輪排序虛擬中間值所在的位置。將虛擬中間值填入該位置中:486

5742

607283

7388

85left

i, j

right

至此,虛擬中間值72找到了它應該所在的位置上。我們使用重複的邏輯對72之前的數列 48, 6, 57, 42, 60 和 72之後的數列 83, 73, 88, 85 進行排序,最終得到排好序的數列。

def quick_sort(array, left, right):

if left >= right:

return

i = left

j = right

x = array[i]

while true:

# 從j開始向前找乙個小於或等於x的數

while j >= i:

if array[j] <= x:

break

j -= 1

if i >= j:

array[i] = x

break

array[i] = array[j]

i += 1

# 從i開始向後找乙個大於x的數

while i < j:

if array[i] > x:

break

i += 1

if i >= j:

array[i] = x

break

array[j] = array[i]

j -= 1

quick_sort(array, left, i-1)

quick_sort(array, i+1, right)

if __name__ == '__main__':

demo = [72, 6, 57, 88, 60, 42, 83, 73, 48, 85]

quick_sort(demo, 0, len(demo)-1)

print(demo)

python實現快速排序

快速排序的思想是任意選取要排序的list中的乙個數pivot,每次遞迴時將list按照 小於pivot的,pivot,大於pivot的 排序,再對小於和大於pivot部分分別快速排序。function quicksort list select a pivot foreach x in list i...

Python實現快速排序

快速排序的思路 numlist 6,8,1,4,3,9,5,4,11,2,2,15,6 1 設 keys 又稱為監視哨 等於 numlist 0 i等於0 j等於len numlist 1,即如下 numlist 6,8,1,4,3,9,5,4,11,2,2,15,6 keys 6 i 0 j2 1...

python實現快速排序

coding utf 8 實現對列表中的數進行快速排序 importrandom 隨機生成乙個有1000整數的列表 number random.randint 1 1000 foriinrange 1000 列印原始列表 printnumber 單個列表快速排序函式 返回一次排序後的列表和所選取基數...