Python排序演算法之快速排序

2021-09-27 12:38:43 字數 2314 閱讀 9354

從列表中抽取乙個元素p(假定為第乙個),

使p歸位,保證左邊的元素都比p小,右邊的元素都比p大。

再遞迴呼叫完成排序

最壞情況:o(n

2n^2

n2)平均情況:o(nlogn)

最好情況:o(nlogn)

最壞情況:o(n)

平均情況:o(logn)

不穩定

較複雜

一開始,從列表中隨機抽取乙個數與第乙個元素互換,使其歸位。

可以有效降低最壞情況發生。

#!/usr/bin/python3

# -*- coding: utf-8 -*-

"""快速排序

思路: 從列表中抽取乙個元素p(假定為第乙個),

使p歸位,保證左邊的元素都比p小,右邊的元素都比p大。

再遞迴呼叫完成排序

時間複雜度:

最壞情況:o(n^2)

平均情況:o(nlogn)

最好情況:o(nlogn)

空間複雜度:(遞迴是耗資源的)

最壞情況:o(n)

最好情況:o(logn)

穩定性:不穩定

複雜性:較複雜

優化:一開始,從列表中隨機抽取乙個數與第乙個元素互換,使其歸位。

可以有效降低最壞情況發生。

"""import random

# 歸位函式

defpartition

(ls, left, right)

:"""歸位函式

保證左邊的元素都比待歸位的元素小,右邊的元素都比待歸位的元素大

args:

:param ls: list, 待歸位的列表

:param left: int, 列表左邊界

:param right: int, 列表右邊界

returns:

int, 歸位值的索引位置

"""# 將歸位值儲存起來

# val = random.choice(list(enumerate(ls, start=0)))[0]

# ls[left], ls[val] = ls[val], ls[left]

tmp = ls[left]

while left < right:

# 如果left == right表示沒有值需要比較了

while left < right and ls[right]

>= tmp:

# 從右邊開始找小的數

right -=

1# 往左移一步

ls[left]

= ls[right]

# 將小的數寫到左邊的空位

while left < right and ls[left]

<= tmp:

# 經上一步賦值,那麼右邊就有空位,所以從左邊開始找大的數

left +=

1# 往右移一步

ls[right]

= ls[left]

# 將大的數寫到右邊的空位

# 歸位值歸位

ls[left]

= tmp

return left

# 快排

defquick_sort

(ls, left, right)

:"""快速排序

args:

:param ls: list, 待排序的列表

:param left: int, 列表左邊界

:param right: int, 列表右邊界

"""if left < right:

# 當列表的元素至少有2個時,才執行排序

mid = partition(ls, left, right)

# 歸位

quick_sort(ls, left, mid -1)

# 遞迴處理左邊,使其有序

quick_sort(ls, mid +

1, right)

# 遞迴處理右邊,使其有序

ls =

[random.randint(0,

100)

for _ in

range(10

)]print

(ls)

quick_sort(ls,0,

len(ls)-1

)print

(ls)

Python排序演算法之快速排序

快排的思想 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。一趟快速排序的演算法是 1 設定兩個變數i j,排序開始的時候 i 0,j n 1 2 以第乙個陣列元素作為關鍵資料,賦值給key,即key...

python演算法之快速排序

步驟為 1 從數列中挑出乙個元素,稱為 基準 pivot 2 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽 partition 操作。3 遞迴地 recursive 把小於...

python演算法之快速排序

快速排序 英語 quicksort 又稱劃分交換排序 partition exchange sort 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列...