zoukankan      html  css  js  c++  java
  • 快排

    思想:

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

    在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

  • 相关阅读:
    四大组件的工作过程
    理解Window和WindowManager
    Android中的动画
    View的工作原理
    62、滑动窗口的最大值
    61、数据流中的中位数
    60、二叉搜索树的第k个结点
    59、序列化二叉树
    58、把二叉树打印成多行
    57、按之字形顺序打印二叉树
  • 原文地址:https://www.cnblogs.com/yu121/p/13534690.html
Copyright © 2011-2022 走看看