快速排序算法,简称快排,是最实用的排序算法,没有之一,各大语言标准库的排序函数也基本都是基于快排实现的。
快排基本思路:快速排序基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
一、使用递归的方式:
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])