算法学习笔记(七)

一、快速排序

和冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。不同之处:冒泡排序再每一轮中只把一个元素冒泡到数列的一端,而快速排序则在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成两个部分。

关键词:基准元素,比它大,比它小。

这个思路叫分治法。这样的好处右什么呢?
假如一个数列为9个元素。冒泡排序则要比较8轮。每一轮把一个元素移动到数列的一端。,时间复杂度是O(n*2)。

脑补一下图。

在分治法的思想下,原数列在每一轮都被拆分成两部分,每一部分在下一轮又分别被拆分成两部分,直到不可再分为止。
每一轮的比较和交换,需要把数组全部元素都遍历一遍,时间复杂度是O(n),假设是N个元素的话,就需要先logn轮。因此快速排序的平均时间复杂度是o(nlogn)。

二,基准元素的选择

基准元素,在分治过程中,以基准元素为中心,把其他元素移动到它的左右两边。
如何选择基准元素?
最简单的方式就是选择数列的第一个元素,大多数情况下是没有问题的,但是假如有一个原本逆序的数列,期望排序成顺序数列。那它就永远都分不成两部分,因为最开始的元素就是最大的那个。

这种情况下基准元素要么就是最大的,要么就是最小的。就无法发挥分治法的优势与作用。

为了避免这种情况,我们就随机选择一个元素来作为基准元素。并且让基准元素和数列首元素交换位置。

这样一来,即使在数列完全逆序的情况下,也可以有效的将数列分成两部分。
当然即使如此,也会有极小的概率会选的最大值或最小值。同样会失去效果。

三,元素的交换

选定基准元素后,我们要做的就是把其他元素小于基准元素的都交换到基准元素的一边,大于基准元素的都交换待基准元素的另一边,
1.双边循环法。
2.单边循环法。

双边循环法:首先给出数列: 4 7 6 5 3 2 8 1

1),选定基准元素,并且设置两个指针left和right,指向数列的最左和最右两个元素。
2),进行第一次循环,从right指针开始,让指针所指向的 元素和基准元素做比较。如果大于或等于基准元素,则指针向左移动,如果小于基准元素,则right指针停止移动,切换到left指针。

在当前数列中,1<4,所以right直接停止移动,换到左指针进行下一步移动。
3),轮到左指针行动,让指针所指向的元素和基准元素做比较,如果小于或等于基准元素,则指针向右移动,如果大于基准元素,则左指针停止移动。
由于左指针开始指向的是基准元素,判定肯定相等,所以左指针右移一位。
4),由于7>4,左指针在元素7的位置停下,这时,让左指针和右指针所指向的元素进行交换。

接下来,进入第二次循环,重新切换到right指针,向左移动。右指针先移动到8,8>4。继续左移,由于2<4。停止在2的位置。
依次类推。
代码如图:
在这里插入图片描述
在这里插入图片描述

结果:
在这里插入图片描述

小结:本节先消化学习双边循环法,下一节我们再来学习单边循环法。
每一次的积累,都会在将来惊艳自己,加油!
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值