快排
阿新 • • 發佈:2020-08-20
思想:
對於給定的記錄,選擇一個基準數,通過一趟排序後,將原序列分為兩部分,使得前面的比後面的小,然後再依次對前後進行拆分進行快速排序,遞迴該過程
在R[low:high]中選定一個元素R[pivot],以此為標準將要排序的序列劃分為兩個序列R[low:pivot-1]與R[pivot+1:high],並使序列R[low:pivot-1]中所有元素的值小於等於R[pivot],序列R[pivot+1:high]所有的值大於R[pivot],此時基準元素以位於正確位置,它無需參加後續排序
解析:
1.初始化:i=low,j=high p = 7 i j [7, 3, 12, 5, 9, 1, 8] 2.從後往前找小於等於p的數,找到l[j]=1 i j [7, 3, 12, 5, 9, 1, 8] 交換 i j [1, 3, 12, 5, 9, 7, 8] 3.從前往後找大於p的數 i j [1, 3, 12, 5, 9, 7, 8] 交換 i j [1, 3, 7, 5, 9, 12, 8] 4.從後往前找小於等於p的數 i j [1, 3, 7, 5, 9, 12, 8] 交換 i j [1, 3, 5, 7, 9, 12, 8] 即: low mid high [1, 3, 5, 7, 9, 12, 8] 原序列一分為二,左子序列為(1,3, 5)元素都比p小,右子序列為(9, 12, 8)元素都比p大
l = [7, 3, 12, 5, 9, 1, 8] def fun(l,i,j): if i>=j: return l low = i high = j p = l[i] while i<j: if p <= l[j]: j -= 1 l[i] = l[j] if p >= l[i]: i += 1 l[j] = l[i] l[j] = p fun(l,low,i-1) fun(l,i+1,high) return l