python演算法之快速排序

2022-07-24 07:42:12 字數 1936 閱讀 5402

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

步驟為:

從數列中挑出乙個元素,稱為"基準"(pivot),

重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會結束,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。

"""快速排序

"""#

遞迴的退出條件

if start >=end:

return

#設定起始元素為要尋找位置的基準元素

mid =alist[start]

#low為序列左邊的由左向右移動的游標

low =start

#high為序列右邊的由右向左移動的游標

high =end

while low

#如果low與high未重合,high指向的元素不比基準元素小,則high向左移動

while low < high and alist[high] >=mid:

high -= 1

#將high指向的元素放到low的位置上

alist[low] =alist[high]

#如果low與high未重合,low指向的元素比基準元素小,則low向右移動

while low < high and alist[low]

low += 1

#將low指向的元素放到high的位置上

alist[high] =alist[low]

#退出迴圈後,low與high重合,此時所指位置為基準元素的正確位置

#將基準元素放到該位置

alist[low] =mid

#對基準元素左邊的子串行進行快速排序

quick_sort(alist, start, low-1)

#對基準元素右邊的子串行進行快速排序

quick_sort(alist, low+1, end)

alist = [54,26,93,17,77,31,44,55,20]

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

print(alist)

從一開始快速排序平均需要花費o(n log n)時間的描述並不明顯。但是不難觀察到的是分割槽運算,陣列的元素都會在每次迴圈中走訪過一次,使用o(n)的時間。在使用結合(concatenation)的版本中,這項運算也是o(n)。

在最好的情況,每次我們執行一次分割槽,我們會把乙個數列分為兩個幾近相等的片段。這個意思就是每次遞迴呼叫處理一半大小的數列。因此,在到達大小為一的數列前,我們只要作log n次巢狀的呼叫。這個意思就是呼叫樹的深度是o(log n)。但是在同一層次結構的兩個程式呼叫中,不會處理到原來數列的相同部分;因此,程式呼叫的每一層次結構總共全部僅需要o(n)的時間(每個呼叫有某些共同的額外耗費,但是因為在每一層次結構僅僅只有o(n)個呼叫,這些被歸納在o(n)係數中)。結果是這個演算法僅需使用o(n log n)時間。

Python排序演算法之快速排序

從列表中抽取乙個元素p 假定為第乙個 使p歸位,保證左邊的元素都比p小,右邊的元素都比p大。再遞迴呼叫完成排序 最壞情況 o n 2n 2 n2 平均情況 o nlogn 最好情況 o nlogn 最壞情況 o n 平均情況 o logn 不穩定 較複雜 一開始,從列表中隨機抽取乙個數與第乙個元素互...

Python排序演算法之快速排序

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

python演算法之快速排序

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