java 快速排序算法简单_数据结构与算法:排序算法之快速排序「详细步骤图解」...

本文详细介绍了快速排序算法的具体步骤,包括如何选取轴值pivot,通过示例数组22,33,49,47,33,'12',68,29的排序过程展示了快速排序的基本原理和操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序

给定一个序列:

22 33 49 47 33' 12 68 29

进行快速排序

主要思想

从序列中,任选一个记录k作为轴值pivot选择策略:第一个元素最后一个元素中间元素随机选择将剩余的元素,分割成 左子序列 L 和 右子序列 RL 中所有元素都 < k, R 中所有元素都 > k对 L 和 R递归进行快排,直到子序列中有 0 个 或者 1 个元素,退出图解

初始数组:选定47为轴值pivot

5ef6efdece7acd5013068edc0e217509.png

pivot与最后一个值29进行交换()

b7a264e599033a6ab7557a93be996024.png

接下来,以pivot=47为界,分成左子序列L和右子序列R比47大的都放在右边,比47小的都放在左边(用的交换)

遍历数组

两个指针left和right当left != right的时候如果left和right未相遇。把right的值赋给left对应的值arr[left] = arr[right]right指针停止移动,轮到left移动如果left和right未相遇,把left的值赋给right对应的值arr[right] = arr[left]left指针停止移动,轮到right移动若arr[left]的,小于等于pivot,且left < right的时候,left右移当arr[right]的值,大于等于pivot,且right > left的时候,right左移注意:轴值用pivot保存第一轮分割序列

ae97dda845c8fe33c4eaaa092bcb3eff.png

pivot=47和最后一个值互换

33cf39d14ce8d236bf5de5755f71a37d.png

22 <= 47,left向右移动

13a2c48de693ae6ca69e790cbba91e51.png

33 <= 47,left向右移动

430c7af6c7233f1d75382d0eeb087372.png

49 > 47,不满足arr[left] <= pivot把left的值赋给right

arr[right] = arr[left]

c87d2014c172ee2b26a97ebc48fa608c.png

赋值过后,left不动,right向左移动

53abe18b5fabd0259e7f45047b015865.png

68 >= 47,right向左移动

1167a8101fd275c6a584421f6b44686f.png

12 < 47,不满足arr[right] >= pivot把right的值赋给left

arr[left] = arr[right]

eb817e491eb17682b93be196782cbd3f.png

赋值过后,right不动,left向右移动

50074af70945ad7a9747cc0fe81572f6.png

29 < 47,left向右移动

c719f10d6408e4744603e9f1ca6b2963.png

33' < 47,left向右移动

b27bf815e8377643c9825530005c710f.png

向右移动后,left == right,退出循环将pivot赋给arr[left]

4445550383504dc0d785de0cc90ba7d4.png

至此,第一轮分割序列完成

第二轮分割序列 --- 左子序列

经过第一轮分割,47左边的是左子序列,右边是右子序列

第二轮对左子序列分割,选择中间值作为pivot

803dc18d79a3bf3dd0f9078329474f28.png

12和33'进行交换

a9857f2ad50bc25323c39557750649b8.png

22 > 12,不满足arr[left] <= pivot把arr[left]赋给arr[right]

arr[right] = arr[left]

042a15196578723e2a74e583856cc271.png

赋值过后,left不动,right向左移动

29、33'、33都比12大,所以right一直移动到下图位置

c0be6d701331b5ee6d770a109ef89590.png

33 > 12,right继续向左移动

46b12f97dc33c49b95373f3dc157d3f8.png

此时right == left,终止循环把pivot赋给arr[left]

1bfbece7fe3119993c2ad8dfe5c3b4a8.png

至此,左子序列1也分割完成了

小结

快排就是一个递归的过程,分割得到左子序列

再对左子序列进行快排分割,得到左子序列的左子序列....

处理完左边,再去处理右边的右子序列

第三轮分割序列 --- 右子序列

右子序列只有47、68、49,选择48作为轴值 pivot

9af12587c20f46d81891d0e5ff91a4d8.png

pivot和最后一个值交换

cdc57a7a2304c1b915e2a0d3f0bce51a.png

47、49都比pivot=68小,left一直向右移动,直到left == right

96c0b19ff51e5d6d3808256401b525a7.png

分割之后,只剩下左子序列:47、49

47、49,选49作为轴值,得到左子序列47子序列只剩下一个元素47,就不必排序了,右边排序结束

结果:47、49、68

C++实现

选择中间的值作为轴值

d72085c9bfc6a4f36157392ccd601a5e.png

daecd9f1975f86afb3f1fc5de6ce5743.png

878375bb0dbc373c05dfb61b79f1c45e.png

总结

014de364912d1a4f10013341fb0699a0.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值