從列表中抽取乙個元素p(假定為第乙個),使p歸位,保證左邊的元素都比p小,右邊的元素都比p大。
再遞迴呼叫完成排序
最壞情況:o(n2n^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 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列...