zoukankan      html  css  js  c++  java
  • 快速排序:递归与非递归

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

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

    一、使用递归的方式:

    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])

      

  • 相关阅读:
    webservice测试工具
    Spring+CXF整合来管理webservice(服务器启动发布webservice)
    BAT常用命令
    【shell入门】Shell用法
    【shell】Shell命令合集(0)
    挨踢江湖之十二
    shell一些笔记
    在优化SQL语句中使用虚拟索引
    Jenkins Maven打包出错异常的解决方法
    [置顶] ios 360度旋转效果demo
  • 原文地址:https://www.cnblogs.com/value-code/p/8472440.html
Copyright © 2011-2022 走看看