def quick_sort(list, left, right): if left >= right: return low = left high = right p = list[left] while left<right: while (left<right) and (list[right] >= p): right = right-1 list[left] = list[right] while (left<right) and (list[left] < p): left = left+1 list[right] = list[left] list[left] = p quick_sort(list, low, left-1) quick_sort(list, left+1, high) if __name__ == '__main__': list_target = [2, 3, 1, 7, 5, 7, 9, 0, 9] quick_sort(list_target, 0, len(list_target)-1) print(list_target)
关键点:
序列切割:
1、挑中间元素:mid = alist[start]
2、右推进:while right > left and alist[right] >= mid:
3、左推进:while left < right and alist[left] < mid:
4、推进循环:while left < right:
5、元素归位:alist[left] = mid
递归拆分:
1、小组边界确定:left = start、right = end
2、递归退出条件:if start < end:
3、函数自调用:quick_sort(alist, start, end)
时间复杂度
最优时间复杂度:O(nlogn)
对于每次快排,left和right的标签分别在左右两册数据全部都移动了一遍,相当于遍历了所有数据,那么时间复杂度是O(n)
因为涉及到了递归分组,所以他的时间复杂度是O(logn)
整体来说:最优的时间复杂度是 O(nlogn)
最坏时间复杂度:O(n2)
因为递归分组分组的条件不一定是二分,有可能每一次mid指定的都是最大或者最小,那么有多少个元素,我们就可能分多少次组,这种情况时间复杂度就是O(n)了
所以最坏的时间复杂度就是O(n2),那么最坏也不过如此了。
稳定性:不稳定