快速排序:递归与非递归

时间:2021-09-07 22:16:05

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

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

一、使用递归的方式:

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