快排

思想:

对于给定的记录,选择一个基准数,通过一趟排序后,将原序列分为两部分,使得前面的比后面的小,然后再依次对前后进行拆分进行快速排序,递归该过程

在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

结果:

参考文档:https://zhuanlan.zhihu.com/p/63227573

原文地址:https://www.cnblogs.com/yu121/p/13534690.html