版权声明:本文为博主原创文章,可以转载,但转载前请联系博主。 https://blog.csdn.net/qq_33528613/article/details/84865374
快速排序
实现
def partition(nums, left, right):
middle = (left+right) // 2
pivot = nums[middle]
swap(nums, middle, right)
# 现在主元 pivot 等于 nums[right]
boundary = left
for index in range(left, right):
if nums[index] < pivot:
swap(nums, index, boundary)
boundary += 1
swap(nums, boundary, right)
return boundary
def qsort(nums, left, right):
if left < right:
pivotIndex = partition(nums, left, right)
qsort(nums, left, pivotIndex-1)
qsort(nums, pivotIndex+1, right)
def quick_sort(nums):
qsort(nums, 0, len(nums)-1)
快速排序平均复杂度?最坏情况如何优化?
平均时间复杂度:O(n log n)(证明略复杂,暂不深究。)
最坏情况:
- 例如每次划分时,都分为 1 个和 n-1 个,快速排序的时间复杂度就是 O(n^2);
- 上述的递归实现,如果待排序列的规模比较小,递归的副作用会凸显出来,效果还不如简单的插入排序。
优化:
- 选主元采用随机方法或 nums[left]、nums[right]、nums[middle] 的中等大小的值。其中,采用中等大小的值作为主元,可以避免在基本有序的序列中,进行快速排序时,出现时间复杂度最坏的情况;
- 在递归的过程中检查当前子问题的规模,当其小于某个阈值时,就不再继续递归,而是直接调用插入排序。
参考文献:
- https://github.com/henry199101/sort/blob/master/quick_sort.py;
- 《数据结构(第 2 版)》 - 浙江大学 - 7.4.2 快速排序 - P272——P276;
- 数据结构(Python) - Lambert - P53——P56;
- 11 快排。
利用快速排序求第 k 大的项
参考文献:
- 215. Kth Largest Element in an Array - LeetCode;
- LeetCode - caikehe:Python min-heap and quick partition solutions (O(nlogn) and O(n) time complexities)
对单链表进行快速排序
参考文献: