快速排序是速度较快的三个排序方法中比较快的.
快速排序的核心在于使元素逐个归位,然后通过递归的思想来实现.接下来我们先来了解一下什么是归位.
元素的归位
如有列表li = [5, 6, 3, 8 ,2 ,4, 3]
将第一个元素5通过调整,使位于其前面的元素都比5小,位于其后的元素都比5大,就实现了5的归位.如图:
这样列表被分为了左右两部分,我们现在只需要对左右两部分递归实现每个元素的归位就可以了.
那么快速排序的代码就可以写成如下:
# 假设归位函数partition函数已经实现
def quick_sort(li, left, right):
if left < right:
mid = partition(li, left, right)
quick_sort(left, mid-1)
quick_sort(li, mid+1, right)
接下来我们实现partition函数就可以:
(1)left指向5的位置,right指向列表的末尾.左边有空位则,从右边开始移动,如果right位置小于tmp,则将right位置的值放在left位置上;如果right位置上的大于等于tmp则right继续向前查找.
(2)此时空位在right,则从左边开始,left指向的位置大于tmp则放在right的位置上;如果小于等于tmp则继续向后寻找.
…
(3)直到left和right指向同一个位置,则此时,将5放在该位置上.
代码实现:
def partition(li, left, right):
tmp = li[left]
while left < right:
while left < right and li[right] >= tmp:
right -= 1
li[left] = li[right]
while left < right and li[left] <= tmp:
left += 1
li[right] = li[left]
li[left] = tmp
复杂度分析
平均事件复杂度为O(nlogn)
最坏的情况复杂度为O(n^2)