快速排序實現的方法有兩種,挖坑法和前後指標法
挖坑法選乙個基準數,通常是第乙個,將其他數與這個基準數比較,定義游標left,right
首先從右邊開始,即right開始向左移動,如果right指向的數小於基準數,就相互調換(否則繼續向左移動),調換後,right游標停止,讓left游標移動,是向右移動。如果left指向的數比基準數大,就與基準數調換,剛才基準數就是right指向的數。迴圈上述操作即可
**如下
'''
挖坑法'''
def quiet_sort(alist, start, end):
if start >= end:
return
mid_value = alist[start]
left = start
right = end
while left < right:
while alist[right] >= mid_value and left < right:
right -= 1
alist[left], alist[right] = alist[right], alist[left]
while alist[left] < mid_value and left < right:
left += 1
alist[left], alist[right] = alist[right], alist[left]
quiet_sort(alist,start,left-1)
quiet_sort(alist,left+1,end)
def main():
# li = [9, 8, 7, 6, 5, 4, 3, 2, 1]
li = [56,78,4,3,42,90]
# li = [54,78,36,36,79,68,0,2,9,1]
quiet_sort(li, 0, len(li)-1)
print(li)
if __name__ == "__main__":
main()
前後指標法
同樣需要選擇乙個基準數
原理就是前後夾擊,大的數放右邊,小的數放左邊,尋找乙個位置給基準數,是的基準數坐邊是小的,右邊是大的
# coding:utf-8
'''以下**對逆序排列的序列無用
'''def quiet_sort(alist, start, end):
if start >= end:
return
#定義乙個基準值
mid_value = alist[start]
#定義左游標
left = start
#定義右游標
right = end
while left < right:
#當右邊邊的值大於基準值時,right游標左移
while alist[right] >= mid_value and left < right:
right -= 1
alist[left] = alist[right]
#當左邊的值小於基準值時,left游標右移
while alist[left] < mid_value and left < right:
left += 1
alist[right] = alist[left]
alist[left] = mid_value
quiet_sort(alist,start,left-1)
quiet_sort(alist,left+1,end)
def main():
# li = [9, 8, 7, 6, 5, 4, 3, 2, 1]
# li = [1, 2, 3, 4, 5, 6, 7, 8, 9]
li = [54,78,36,36,79,68,0,2,9]
quiet_sort(li, 0, len(li)-1)
print(li)
if __name__ == "__main__":
main()
超級通俗易懂的演算法實現講解 (一) 歸併排序
對於歸併排序,我們收到的任務很明確 就是對一組無序 當然也有可能有序啦 的不明是否有序的資料進行排序,使這組序列實現從小到大的排列順序,這裡給出一組樣例輸入 8 5 9 2 6 3 7 1 10 4 我們不妨將序列先放入陣列中 define max 500 int n int s max cin n...
通俗演算法教程04 演算法相關的基礎概念
本系列前面兩篇講的都是一些背景知識,從這一篇開始我們正式講演算法,從演算法的一些基本概念講起。確切地說,演算法是有限步驟的計算過程,該過程取某個值或集合作為輸入,並產生某個值或集合作為輸出。如果演算法對於每個輸入都可以正確的停機,則稱該演算法是正確的,並稱正確的演算法解決了給定的計算問題。乙個不正確...
逐步講解快速排序演算法及C 版的實現示例
演算法思想 快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法 divide and conquermethod 該方法的基本思想是 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它...