运用递归的思想,选取一个基准值(一般选择数组第0位的元素),分别将小于和大于基准值的剩余的数组成两个数组(less,greater)分别放在基准值的两侧,直到这两个数组(less,greater)元素个数为1时为止,此时排序结束。
def quicksort(array):
if len(array)<2:
return array
else:
pivot=array[0]
less=[i for i in array[1:] if i<=pivot]
greater=[i for i in array[1:] if i>pivot]
return quicksort(less)+[pivot]+quicksort(greater)
print(quicksort([10,5,2,3,7]))
当然,这种排序算法的性能高度依赖于你选取的基准值,假设你总是将第一个元素用作基准值,且要处理的数组是有序的。由于快速排序算法不检查输入数组是否有序,因此它依然尝试对其进行排序。
比如针对一个按顺序排好的1~8的数组进行排序:
注意, 数组并没有被分成两半,相反,其中一个子数组始终为空,这导致调用栈非常长。现
在假设你总是将中间的元素用作基准值,在这种情况下,调用栈如下。
调用栈短得多!因为你每次都将数组分成两半,所以不需要那么多递归调用。你很快就到达
了基线条件,因此调用栈短得多。