用Python實現八大排序演算法 快速排序

2021-07-24 07:05:19 字數 2506 閱讀 4340

一、概述

最近在用python學習經典的8大排序演算法,以鞏固基礎知識,同時強化自己的python技能。下面對快速排序做乙個簡要介紹。

快速排序:設要排序的陣列是a[0]……a[n-1],首先任意選取乙個資料(通常選用陣列的第乙個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。

快速排序演算法流程:

step 1 : 設定兩個變數i,j 排序開始時,i=0,j=n-1

step 2 : 以第乙個資料元素作為關鍵資料,記為key=a[0]

step 3 : 從j開始向前搜尋j–,找到第乙個小於key的值交換a[j]和a[i]

step 4 : 從i開始向後搜尋i++,找到第乙個大於key的值交換a[i]和a[j]

step 5 : 重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中a[j]不小於key,4中a[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。

假設使用者輸入了如下陣列:

下標 0 1 2 3 4 5

資料 6 2 7 3 8 9

首先,設定i=0,j=5,key=a[0]=6

我們需要將所有比key小的數移到左邊,所以開始尋找比6小的數,從j開始向左尋找,不斷遞減變數j的值。我們發現a[3]=3比6小,因此交換下標為0和3的位置,所得新的陣列為

下標01 234 5

資料32 768 9

此時i=0,j=3,key=6

接下來,尋找比key大的數值,從i開始向右進行搜尋 a[2]=7>6,則交換兩數字置

下標 0 1234 5

資料 3 2678 9

此時i=2,j=3,key=6

上面兩次比較為乙個迴圈,接著,再遞減變數j,不斷重複進行上面的迴圈比較。直到i=j迴圈結束。

然後,對k兩邊的資料,再分組分別進行上述的過程,直到不能再分組為止。

#!/usr/bin/python3

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

defsub_sort

(lists,low,high):

key = lists[low]

while low < high:

while low < high and lists[high] >= key:

high -= 1

print("**********=")

print("low=")

print(low)

print("high=")

print(high)

print(lists)

while low < high and lists[high] < key:

lists[low] = lists[high]

low += 1

lists[high] = lists[low]

print("**********=")

print("low=")

print(low)

print("high=")

print(high)

print(lists)

lists[low] = key

return low

defquick_sort

(array, low, high):

if low < high:

key_index = sub_sort(array,low,high)

#遞迴進行排序

quick_sort(array, low, key_index)

quick_sort(array, key_index+1, high)

if __name__ == "__main__":

lists = [3, 5, 4, 2, 1, 6]

print(lists)

quick_sort(lists, 0, 5)

python 程式執行過程及執行結果

本文參考自:

用Python實現八大排序演算法 氣泡排序

冒泡重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。氣泡排序 defbubble sort lists count len lists for i in range 0,count for j ...

用Python實現八大排序演算法 堆排序

1.堆是一種資料結構 可以將堆看作一棵完全二叉樹,這棵二叉樹滿足,任何乙個非葉節點的值都不大於 或不小於 其左右孩子節點的值。2.堆的儲存 一般用陣列來表示堆,若根節點存在於序號0處,i結點的父結點下表就為 i 1 2,i結點的左右子結點下標分別為2i 1和2i 2 3.堆排序思想 利用大頂堆 小頂...

八大排序演算法python實現

1.氣泡排序 氣泡排序重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢 浮 到數列的頂端,故名。步驟 比較相鄰的元素。如果第乙個比第二個大,就交...