面试最常考的编程题 —— 排序。
今天是,快速排序。如果你想看更多,
1. 实现过程
快速排序是如何实现的?以[3,6,4,2,1,5]
为例,看看中间过程。
能看出点头绪吗?下面是注解版…… :)
2. 关键思路
快速排序,类似「二分法」。
每一轮中,
- 选取「基准数」(本例中,以比较范围内第一个数为基准);
- 「分区」:将数据划分到基准数两边,比基准数小的摆放在基准前面,比基准数大的摆在基准的后面。完成后,分成了两个区,而基准数处于数列的分割点位置。
每一轮结束,都排好了基准数。
下一轮,则循环以上过程,对分区的两部分数据继续划分。
3. 代码实现
def QuickSort(arr):
return qsort(arr, 0, len(arr)-1)
def qsort(arr, left, right):
if left >= right:
return arr
key = arr[left] # 基准数
lp = left # 左指针
rp = right # 右指针
while lp < rp:
while arr[rp] >= key and lp < rp:
rp -= 1 #右指针向左移动
while arr[lp] <= key and lp < rp:
lp += 1 #左指针向右移动
arr[lp], arr[rp] = arr[rp], arr[lp] # 左右指针对应的数交换位置
arr[left], arr[lp] = arr[lp], arr[left] # 把基准数交换到分割点位置
qsort(arr, left, lp-1)
qsort(arr, rp+1, right)
return arr
4. 结合代码和中间过程,再次体会
5 评价
- 时间复杂度
- 快速排序最优的情况就是每一次取到的元素都刚好平分整个数组,此时时间复杂度为 O( nlogn );
- 最差的情况就是每一次取到的元素就是数组中最小/最大的,这种情况退化成冒泡排序了(每一次都排好一个元素的顺序),此时时间复杂度为 O( n^2 );
- 快速排序的平均时间复杂度是 O(nlogn)。
- 空间复杂度
- 最优的情况下,每一次都平分数组的情况,空间复杂度为 O(logn) ;
- 最差的情况下,退化为冒泡排序的情况,空间复杂度为 O( n ) 。