快速排序 遞迴演算法

2021-09-25 19:02:02 字數 1542 閱讀 3028

快速排序原理:從乙個陣列中任意挑選乙個元素(通常為最左邊的元素)作為基準數,

將剩下的元素和基準數進行比較,將小於等於中軸元素的放到基準數的左邊,經大於

中軸元素的放到基準數的右邊,然後以當前基準數的位置為界,將左半部分陣列和右

半部分陣列堪稱兩個新的陣列,重複上述操作,直到子陣列的元素個數小於等於1.

選乙個作為分界的位置,選乙個劃分的位置,設定排序條件。本文選擇最右邊作為分界值,最左邊最為劃分的位置,從左邊第乙個元素開始一直到倒數第二個為止,逐一和分界值進行比較,大於分界值的數字不做任何修改,小於分界值的元素與劃分的位置交換,劃分位置後移移位,直到全部比完,第一輪結束,一直到左、右部分的陣列內個數小於等於1時,快速排序完成。

lista = [1,5,8,34,19,20,33,11]      #定義排序的序列

def quikswith(listarr,left,right): #定義比較與交換的函式

'''@引數:listarr是需要排序的列表

left是起始位置

right是結束位置

'''div = listarr[right] #分界值,預設取最後乙個元素,用來劃分使用

position = left #記錄劃分的位置

for i in range(left,right): #用列表中的其他元素與分界值比較

if listarr[i] > div: #大於分界值,不作任何操作

#position不變

pass

else:

listarr[i],listarr[position]=listarr[position],listarr[i] #小於分界值時,交換劃分位置和元素的位置

position += 1 #劃分位置向後移一位

pass

print(lista) #檢驗過程

pass

listarr[position],listarr[right]=listarr[right],listarr[position] #退出迴圈後分界值與劃分位置交換

print(lista)

return position #返回記錄的位置

pass

def quiksort(listarr,left,right): #定義遞迴函式,呼叫比較與交換的函式和函式自己本身。

if left >= right: #退出條件

return none

position = quikswith(listarr,left,right) #繼續劃分,直到只有乙個數或沒有數

quiksort(listarr,left,position - 1) #前半部分

quiksort(listarr,position + 1,right) #後半部分

pass

print(quiksort(lista,0,len(lista)-1)) #呼叫函式

print(lista) #輸出結果

快速排序非遞迴演算法

本人根據書上的三數中值快速排序修改 struct leftright inline void swap int a,int b void qsort int a,int left,int right for int m 1 0 k ma center swap a left a center if ...

快速排序 非遞迴演算法

include stdafx.h include using namespace std int myarray void printarray int array,int len printf r n int partition int s,int l,int r 從左向右找大於或等於x的數來填s...

非遞迴快速排序演算法

昨天做人人網筆試題,其中乙個就是快排非遞迴演算法,當時考慮的不全面,下面發下正確答案。先說遞迴演算法 include include using namespace std int partion int arr,int p,int r int temp arr i arr i arr p arr ...