快速排序思路:
- 取一个元素p(第一个元素),使元素p归位
- 列表被p分为两部分,左边都比p小,右边都比p大
- 递归完成排序
动画演示如下:
代码如下:
def partition(li, left, right):
tmp = li[left]
while left < right:
while left < right and li[right] >= tmp: #从右面找比tmp小的数
right -= 1 # 往左走一步
li[left] = li[right] #把右边的值写到左边空位上
while left < right and li[left] <= tmp:
left += 1
li[right] = li[left] #把左边的值写到右边空位上
li[left] = tmp # 把tmp归位
return left
def _quick_sort(li, left, right):
if left<right: # 至少两个元素
mid = partition(li, left, right)
_quick_sort(li, left, mid-1)
_quick_sort(li, mid+1, right)
空间复杂度:
- 最好情况:O(log2n)
- 平均情况:O(log2n)
- 最坏情况:O(n)
时间复杂度:
- 最好情况:O(nlog2n)
- 平均情况:O(nlog2n)
- 最坏情况:O(n^2)
快速排序是所有内部排序算法中平均性能最优的排序算法。
快速排序不适用于对原来有序或基本有序的记录序列进行排序。