快速排序 python實現 歸併(高階排序法)

2021-09-26 01:41:42 字數 2169 閱讀 4960

維基百科:

快速排序(英語:quicksort),又稱劃分交換排序(partition-exchange sort),簡稱快排,一種排序演算法,最早由東尼·霍爾提出。在平均狀況下,排序 n個專案要o(nlog n)次比較。在最壞狀況下則需要o(n^2) 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地達成。

快速排序思路:

1,挑選基準值:從數列中選出乙個元素,稱為「基準」(pivot)(一般選最左端的)

2, 分割:重新排序數列,把所有比基準值小的放在基準這前面,所有比基準值大的放在基準值後面 (與基準值相等的隨意)分割完成之後對基準值的排序就已完成。

3,遞迴排序子數列:遞迴地將小於基準元素的子串行和大於基準元素的子串行排序

例如:[3,4,2,6,7,1,5]

不羅嗦了,上**:

# 快速排序(經典演算法)

def quick_-sort(li,left,right):

if left > right:

return

pivot = li[left]#定乙個基準

i = left

j = right

while i != j:

while li[j] >= pivot and i < j:#從左邊找比基準大的數

j -= 1

while li[i] <= pivot and i < j:#從右邊找比基準小的數

i += 1

if i < j:

li[i],li[j] = li[j],li[i]

li[left] = li[i]

li [i] = pivot

quick_sort(li,left,i-1)

quick_sort(li,i+1,right)

li=l =input('請輸入要排序的資料(用,分隔開):')

l = l.split(',')

for i in l:

i = int(i)

print(f'需要排序的資料:')

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

print(f"排完序:")

這裡我還想說明的一點是,當時我在碼**的時候是先遍歷的i,後遍歷的j,但是這時候結果出現錯誤,我發現當先遍歷i的情況下,最後當i=j是對應的數可能會比基準值大,這樣再交換,第一輪完事後,基準值左邊的有比基準值大的數,所以結果會出現錯誤,下面是我對先遍歷i的**修正

def quick_sort(li,left,right):

if left > right:

return

pivot = li[left]

i = left

j = right

while i != j:

while li[i] <= pivot and i < j:

i += 1

while li[j] >= pivot and i < j:

j -= 1

if i < j:

li[i],li[j] = li[j],li[i]

if li[i] <= pivot:#這裡我做了乙個條件判斷,避免了前面的問題

li[left] = li[i]#當li[i]<=時就和經典的情況完全一致

li [i] = pivot

quick_sort(li, left, i - 1)

quick_sort(li, i + 1, right)

else:#當li[i]>pivot時向前移乙個就好了

li[left] = li[i-1]

li[i-1] = pivot

quick_sort(li,left,i-2)

quick_sort(li,i,right)

li=l =input('請輸入要排序的資料(用,分隔開):')

l = l.split(',')

for i in l:

i = int(i)

print(f'需要排序的資料:')

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

print(f"排完序:")

快速排序 堆排序 歸併排序的python實現

1.快速排序 class quicksort def init self,nums self.nums nums def partition self,left,right key self.nums left while left key 注意這裡有個 用來防止key被來回交換而陷入死迴圈。rig...

歸併排序 快速排序c 實現

假定由小到大排。1 思想 分解 二分為左右兩部分 遞迴地對兩邊歸併 對左邊歸併,對右邊歸併 合併 合併左右為乙個。2 code 輸入 6 60 90 50 30 20 40 輸出 20 30 40 50 60 90 include include using namespace std 合併v lo...

歸併,快速排序

歸併排序 實現思想 歸併的含義很明顯就是將兩個或者兩個以上的有序表組合成乙個新的有序表。歸併排序中一般所用到的是2 路歸併排序,即將含有n個元素的序列看成是n個有序的子串行,每個子串行的長度為1,而後兩兩合併,得到n 2個長度為2或1的有序子串行,再進行兩兩合併。直到最後由兩個有序的子串行合併成為乙...