14.快速排序
概念
快速排序(Quicksort),又称为交换排序,通过一趟排序将要排序的数据分割为独立的两部分。假设要排序的列表是A[0]…A[N-1],首先任意选取一个数据(通常选用列表的第一个数)作为基准数据,一般我们都选择第一个数作为基准数据,然后将所有比它小的数都放到它的左边,所有比它大的数都放到它的右边,这个过程称为快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变化。
算法步骤
- 设置两个low、high,排序开始的时候:low=0,high=N-1
- 以第一个列表元素作为基准数据,赋值给mid,即mid=A[0]
- 从high开始向前搜索,即由后开始向前搜索(high–),找到第一个小于mid的值A[high],将A[high]和A[low]的值交换
- 从low开始向后搜索,即向前开始向后搜索(low++),找到大于mid的A[low],将A[low]和A[high]的值交换。
- 重复第3、4步,直到low=high;
时间复杂度
- 最优时间复杂度:O(nlogn) #每次分成两半,要分logn次,再乘遍历的n次
- 最坏时间复杂度:O(n2) #每次只分出一个元素出来,要分n次,再乘遍历的n次
- 稳定性:不稳定
算法实现
1 | def quick_sort(alist,start,end): |
总结
主要是两个指针的交替变化,可以用while循环来执行,判断high是不是大于mid,大于的话就不用交换,之间high–,直到小于的时候进行交换;判断low是不是小于mid, 小于的话就不用交换,之间low++,直到大于的时候进行交换;最后再加上基准,这样就完成一次快速排序,之后再从外面用一个while循环,里面用递归思想不断对左序列和右序列进行操作,记得写一个出口,start >= end,这样快速排序算法就结束了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 咋的个人博客!




