快速排序

本文介绍了快速排序的基本思想、基准元素的选择及其重要性,并详细讲解了挖坑法和指针交换法两种实现方法,包括每种方法的操作过程和示例。文章还探讨了快速排序的时间复杂度和稳定性,指出其在最坏情况下的时间复杂度为O(n²),平均时间复杂度为O(nlogn),且快速排序是不稳定的。
摘要由CSDN通过智能技术生成

一、什么是快速排序

     快速排序同冒泡排序一样,是一种交换排序,通过元素之间的比较和交换达到排序目的。不同的是,冒泡排序每一轮只把一个元素(该轮最大/最小)冒泡到最右端;而快速排序每一轮则是选一个基准元素( pivot),并让其它比基准元素小的数通过交换放在基准元素左端,而比基准元素大的数则放在基准元素的右端,从而把待排序的数列拆分成两部分,这就是分治法的典型应用。然后不断重复这个过程(递归),待排序的序列就变成了有序序列。

二、基准元素的选择

    通过上述对快速排序思想的了解,可以发现:基准元素的选择很重要。一般情况下,基准元素最简单的就是选择序列的第一个元素,但是如果待排序的序列是一个逆序序列,期望排序成一个顺序序列,每一轮排序选择第一个元素作为基准元素,会出现什么情况呢?如下图:

从上图中可以看出:在这种情况下,每一轮排序只会确定基准元素的位置(第一个元素/最后一个元素),而没有把序列分成较为均匀的两部分,在这种情况下,快速排序需要进行N轮,发挥不了分治法的优势,排序的时间复杂度将会是O(n²)

要解决上述问题,基准元素的选取我们可以不选取第一个元素,而是采用随机选取基准元素。但是,即便是这样做,也有很小的几率选到数列的最大/最小元素作为基准元素,同样会影响分治的效果,所以快速排序平均时间复杂度是nlog(n),最坏时间复杂度是O(n²)

三、快速排序的两种实现方法

     看到这里,我们讨论了基准元素的选择,但是没有讨论快速排序具体的分治算法。现在已有的针对快速排序的分治算法,比较典型的有两种,一种是挖坑法,另一种是指针交换法。下面我们来一一学习这两种算法。

3.1 挖坑法

     什么是挖坑法呢?顾名思义,每一次我们先挖好一个“坑”,然后寻找符合条件的元素填入坑中,填坑的元素的位置又变成新的坑,重复这个过程(挖坑—填坑—挖坑),直到寻找元素的左右指针相交,相交的位置填入基准元素的值,一轮排序结束。用文字说明有些地方说的不够详细,而且有些抽象,下面用图来描述这个过程:

给定原始数列如下,要求从小到大排序:

首先,选择基准元素(这里选第一个元素),记住基准元素的位置index值pivot,这个位置就是“坑”的位置,然后设置两个指针left和right,分别指向序列的左右两端的端点:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值