快速排序概述
快速排序也称为拆分交换排序,它从无序队列中提取元素,并将无序队列拆分为两个独立的部分。 其中一个部分的所有数据都小于其他部分的所有数据,用这种方法分别快速排序这两个部分的数据,然后递归地完成整个排序过程,从而使整个数据成为有序序列。
简而言之,选择要素,分组,分组,重复前两个步骤
快速排序原理示意图
在快速排序概述中,我们发现快速排序主要有两个方面:
选择要素分组,将整体递归分组
元素分类组图像:
特点:
1、因为是无序队列,所以位置可以随机选择
2、暂时划分保管我们选择的中间要素的空间
3、左标签位置空,移动右标签,反之亦然
4、重复3次直到左右侧标签指向同一位置,
5、将暂时保存的中间元素放回位置
一句话:左手右手一个慢动作,右手左手重播慢动作
整体分割图像:
特点:
1、递归分割
2、拆分到最后,所有组内元素个数为1
一句话:递归分割,不能再分割了
代码实践分析
根据上面两个模式图的分析,我们要从两个大方面进行分析:
序列切割和递归分割
1、顺序切割
测序这一知识点从四个方面分别介绍。
三个基本标签:右侧推进、左侧推进、停止推进(即元素归位) ) )。
1.1、三个基本标签
区域断开至少涉及三个标签。
mid指定要剪切的临时中间数字
左:从队列左侧推进的标签
right :从队列右侧推进的标签
defquick_sort(Li,start,end ) : #分区托管分为两个# start=end,证明要处理的数据只有一个# startend,右边是数据# start=end 将分别指向0和末尾位置的left=start right=end #的位置的数据,作为中间值mid=Li [ left ] while left right 3360 #使右光标向左移动,以找到比mid小的值为目的左光标位置whileleftrightandli [ right ]=mid : right-=1li [ left ]=Li [ right ] #将左光标向右移动,目的是找到大于mid的值right光标位置whileleftrightandli [ left ] mid : left=1li [ right ]=Li [ left ] # while结束后,将mid置于中间位置,left=right Li [ left-1 ) #递归处理右边的数据quick_sort ) Li,left 1,end ) if_ ) 3,2,1 ] # l=3[ 2,1,5,6,5,4 ] # [ 2,1
序列剪切:
1、选择中间元素: mid=alist[start]
2、右推进: whilerightleftandalist [ right ]=mid :
3、左推进: whileleftrightandalist [ left ] mid :
4、推动循环: while left right:
5、元素归位: alist[left]=mid
递归拆分:
1、组边界确定: left=start、right=end
2、递归终止条件: if start end:
3、函数的自调用: quick_sort(alist,start,end ) ) ) ) ) ) ) )。
时间的复杂性
最佳时间复杂度: o(nlogn ) ) ) ) ) ) ) )。
对于每个第一列,left和right的标签分别移动了左右2册数据的全部,相当于遍历了所有数据,时间复杂度为o(n )
因为涉及递归分组,所以他的时间复杂度是o(logn )
总的来说,最佳的时间复杂度是o(nlogn )
最差的时间复杂度: o(N2 ) ) ) ) ) ) ) )。
递归分组的条件不一定是两分钟,因此可能为每个mid指定最大值或最小值。 那么,有几个要素,我们可以分成几次组? 在这种情况下,时间复杂度为o(n )
因此,最坏的时间复杂性是o(n2 ),最差也不过如此。
稳定性:不稳定
思考:
改变哪个地方,结果是降序?
将wilerightleftandalist [ right ]=mid :代码中的=更改为=
while left right and a list [ left ] mid代码的
本节内容总结:
1、快速排序原理:选择要素,分组,分组重复前两步。
2、快速排序实践步骤:
分区组:准备工作左右移动要素归位
递归:函数自调用终止条件