• 快速排序:递归与非递归


    快速排序算法,简称快排,是最实用的排序算法,没有之一,各大语言标准库的排序函数也基本都是基于快排实现的。

    快排基本思路:快速排序基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    一、使用递归的方式:

    def partition(l,left,right):    
        tmp=l[left]
        while left<right:
            while left<right and l[right]>=tmp:
                right-=1
            l[left]=l[right]
            while left<right and l[left]<=tmp:
                left+=1
            l[right]=l[left]
        l[left]=tmp
        return left
    
    def quick_sort(l,left,right):
        if left<right:
            mid=partition(l,left,right)
            quick_sort(l,left,mid-1)
            quick_sort(l,mid+1,right)
    
    l=[i for i in range(10000)]
    random.shuffle(l)
    print(l)
    quick_sort(l,0,len(l)-1)
    print(l)

    二、使用非递归方式:用到的是栈的思想

      其中需要考虑两个问题:

      1)栈里边保存什么?

      2)迭代结束的条件是什么?  

      - 栈里边保存的是需要迭代的函数参数

      - 结束条件也是跟需要迭代的参数有关。对于快速排序来说,

      迭代的参数是数组的上边界low和下边界high,迭代结束的条件是low == high。

    def quick_sort(l, left, right):
        if left >= right:
            return
        stack = []
        stack.append(left)
        stack.append(right)
        while stack:
            low = stack.pop(0)
            high = stack.pop(0)
            if high - low <= 0:
                continue
            x = l[high]
            i = low - 1
            for j in range(low, high):
                if l[j] <= x:
                    i += 1
                    l[i], l[j] = l[j], l[i]
            l[i + 1], l[high] = l[high], l[i + 1]
            stack.extend([low, i, i + 2, high])

      

  • 相关阅读:
    接口测试—-工具篇,实现接口自动化
    接口自动化测试,完整入门篇
    接口测试系列汇总
    Java教程
    补充三:国际化
    补充二:会话控制——Cookie
    补充一:EL简介
    ES6——JavaScript 的下一个版本标准
    hibernate---session查询
    缓存技术--页面缓存
  • 原文地址:https://www.cnblogs.com/value-code/p/8472440.html
Copyright © 2020-2023  润新知