快速排序原理:從乙個陣列中任意挑選乙個元素(通常為最左邊的元素)作為基準數,
將剩下的元素和基準數進行比較,將小於等於中軸元素的放到基準數的左邊,經大於
中軸元素的放到基準數的右邊,然後以當前基準數的位置為界,將左半部分陣列和右
半部分陣列堪稱兩個新的陣列,重複上述操作,直到子陣列的元素個數小於等於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 ...