目錄
快速排序思路
邏輯演示 **
複雜度分析
快速排序又稱為分割交換排序法,是目前公認最佳的排序法,也是使用「分而治之"的方式,先會在資料中找到乙個虛擬的中間值,並按此中間值將所有打算排序的資料分為兩部分。其中小於中間值的資料放在一邊,而大於中間值的資料放在另一邊,再以同樣的方式分別處理左右兩邊的資料,直到排序完成為止。
以一串資料 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 單個列表快速排序函式 返回一次排序後的列表和所選取基數...