思想:
对于给定的记录,选择一个基准数,通过一趟排序后,将原序列分为两部分,使得前面的比后面的小,然后再依次对前后进行拆分进行快速排序,递归该过程
在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
结果: