快速排序算法详细图解_算法连载之快速排序

举例

d34d7978eadbc376fa1e6cfd7548eb99.png

待排序数组:7,1,9,2,索引位置为0-4

<1> 切分:i初始指向索引0元素;选择2为元数据,开始遍历,7比元数据大,则继续遍历;1比元数据小,则1同索引i元素交换,i增1,指向索引1元素;9比元数据大,且为倒数第二项元素,结束。遍历完成后,将索引i元素同元数据交换。切分完成后,划分为两个待排序数组:1和9、7。

<2>切分:数组1只有一项元素,因此i索引为0。左侧索引为0-0,右侧索引为1-1。

<3>索引位置为0-0,开始索引不小于结束索引,返回。

<4>索引位置为1-1,开始索引不小于结束索引,返回。

<5>切分:i初始指向索引2元素;选择7为元数据,开始遍历,9比元数据大且为倒数第二项元素,结束。遍历完成后,将索引i元素同元数据交换。切分完成后,划分为两个待排序数组:左侧为空数组,右侧是9。

<6>索引位置为2-2,开始索引不小于结束索引,返回。

<7>切分:数组9只有一项元素,因此i索引为3。左侧索引为3-3,右侧索引为4-4。

<8>索引位置为3-3,开始索引不小于结束索引,返回。

<9>索引位置为4-4,开始索引不小于结束索引,返回。

最后得到的数组即为有序数组。

算法

1)切分:初始i指向第一项元素。选择最后一项为元数据,从第一项开始与元数据比较,直到倒数第二项止。当小于等于元数据,该项元素同第i项交换,同时i增一。全部遍历完毕后,将第i项同元数据交换。最后,i左侧均小于等于元数据,i右侧均大于元数据。

2)继续将i左侧待排序数组和右侧待排序数组分别继续执行第1)步,直到待排序数组开始索引不小于结束索引为止。

实现

b9218ebd57b5410f1026f31cf25c429f.png

快速排序将问题划分为左右两个待排序子数组,因此求解子数组是原数组规模的1/2。时间复杂度T(n) = 2T(n/2),树的深度是lgn。而每一层同元数据交换时间复杂度是n。因此,快速排序的时间复杂度是O(nlgn)。

通过上述分析,可以发现n个元素共需要进行n次切分。

对于性能取决于划分是否平衡;平衡,性能与归并排序一样;不平衡,性能接近插入排序。已有序(升序)数组不如插入排序,对于有序数组,插入排序的时间复杂度是O(n)。而对于快速排序树的深度变为n,时间复杂度降为O(n²)。

为了解决划分的平衡问题,我们可以在待排序数组中随机选择元数据。这样快速排序平均复杂度就是O(nlgn)。快速排序在速度上和归并排序一样,但不同于归并排序,其属于原址排序,不需要额外的空间。所以在实际中,经常选用快速排序算法解决大量数据的排序问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值