快速排序 | 通俗易懂的理解排序过程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44915703/article/details/100153379

面试最常考的编程题 —— 排序。

今天是,快速排序。如果你想看更多,


1. 实现过程

快速排序是如何实现的?以[3,6,4,2,1,5]为例,看看中间过程。
在这里插入图片描述
能看出点头绪吗?下面是注解版…… :)
在这里插入图片描述


2. 关键思路

快速排序,类似「二分法」。

每一轮中,

  1. 选取「基准数」(本例中,以比较范围内第一个数为基准);
  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 评价

  1. 时间复杂度
  • 快速排序最优的情况就是每一次取到的元素都刚好平分整个数组,此时时间复杂度为 O( nlogn );
  • 最差的情况就是每一次取到的元素就是数组中最小/最大的,这种情况退化成冒泡排序了(每一次都排好一个元素的顺序),此时时间复杂度为 O( n^2 );
  • 快速排序的平均时间复杂度是 O(nlogn)。
  1. 空间复杂度
  • 最优的情况下,每一次都平分数组的情况,空间复杂度为 O(logn) ;
  • 最差的情况下,退化为冒泡排序的情况,空间复杂度为 O( n ) 。

猜你喜欢

转载自blog.csdn.net/weixin_44915703/article/details/100153379