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