algorithm - 以第一个元素为中心的快速排序
问题描述
我正在研究快速排序,当第一个元素被选为轴心点时,我很困惑它是如何工作的。
我试图追踪快速排序算法的第一步,将枢轴 S[1] (17) 移动到适当的位置。
示例:[17, -10, 7, 19, 21, 23, -13, 31, 59]。
^# = pivot
^ pointer
我的理解:
对第一部分进行分区(这部分中的所有元素都小于枢轴)。
17, -10, 7, 19, 21, 23, -13, 31, 59
^# ^
比较 1. 没有交换。
17, -10, 7, 19, 21, 23, -13, 31, 59
^# ^
比较 2. 没有交换。
17, -10, 7, 19, 21, 23, -13, 31, 59
^# ^
比较 3. 交换。
-13, -10, 7, 19, 21, 23, 17, 31, 59
^ ^#
比较 4. 交换。
-13, -10, 7, 19, 21, 17, 23, 31, 59
^ ^#
比较 5. 交换。
-13, -10, 7, 19, 17, 21, 23, 31, 59
^ ^#
比较 6. 交换。
-13, -10, 7, 17, 19, 21, 23, 31, 59
^ ^#
比较 7. 没有交换。
-13, -10, 7, 17, 19, 21, 23, 31, 59
^ ^#
比较 9. 没有交换。
-13, -10, 7, 17, 19, 21, 23, 31, 59
^ ^#
比较 10. 没有交换。
这是它的工作原理吗?是否需要 10 次比较和 4 次交换才能将枢轴 S[1] (17) 移动到正确位置?
解决方案
快速排序将有两个移动指针和一个枢轴指针
并且这些移动指针的初始位置将是 0 和 n-1 个位置(第一个和最后一个元素),并且右点将向左移动以寻找更短的元素,然后一旦找到该元素左指针开始向右移动以寻找一个大于枢轴的元素一旦他们找到这些元素,他们就会交换并继续做同样的事情,直到两个指针相遇
一旦他们相遇,就会将该元素与枢轴元素交换。
查看下面示例的指针移动
17, -10, 7, 19, 21, 23, -13, 31, 59
^# ^
17, -10, 7, 19, 21, 23, -13, 31, 59
^# ^
17, -10, 7, 19, 21, 23, -13, 31, 59
^# ^
右指针找到 -13 < 17 现在开始移动左指针
17, -10, 7, 19, 21, 23, -13, 31, 59
\# ^ ^
17, -10, 7, 19, 21, 23, -13, 31, 59
\# ^ ^
17, -10, 7, 19, 21, 23, -13, 31, 59
\# ^ ^
左点找到一个值 19 > 17 现在交换两个指针值
17, -10, 7, -13, 21, 23, 19, 31, 59
\# ^ ^
开始移动正确的点以找到较小的值然后枢轴点
17, -10, 7, -13, 21, 23, 19, 31, 59
\# ^ ^
17, -10, 7, -13, 21, 23, 19, 31, 59
\# ^ ^
17, -10, 7, -13, 21, 23, 19, 31, 59
\# ^ ^
-13, -10, 7, 17, 21, 23, 19, 31, 59
^ \#^
推荐阅读
- c - 可以直接转换成write吗?
- c# - System.JSON 不会为格式错误的 JSON 输入抛出异常
- android - android volley如何发送数组?
- c++ - FindThreads 仅在启用 C 或 CXX 语言时才有效
- drop-down-menu - 如何从 JMeter 中的下拉列表中捕获值
- react-native - 如何在 React Native 中编写等效的 IF / ELSE 语句?
- php - 使用 Fetch(乏味)来接收/接收电子邮件
- python - Openhab2 exec 使用 pigpio 和 gpiozero 绑定到外部 rpi
- raspberry-pi - 在运动检测事件时在 Motion Eye 上执行 Python 脚本
- fiware - 监控 Orion Context Broker 以创建新的 XACML 规则