快速排序:递归与非递归

Posted 世界辣么大

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序:递归与非递归相关的知识,希望对你有一定的参考价值。

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

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

一、使用递归的方式:

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

 

  

以上是关于快速排序:递归与非递归的主要内容,如果未能解决你的问题,请参考以下文章

数据结构大量数据(20万)的快速排序的递归与非递归算法三数取中思想

算法之归并排序的递归与非递归的实现

快速排序-递归实现

排序算法:直接插入排序归并排序(递归与非递归实现)

排序算法:直接插入排序归并排序(递归与非递归实现)

排序算法:直接插入排序归并排序(递归与非递归实现)