我正在研究Quick-Sort,当选择第一个元素作为枢轴点时,它的工作方式使我感到困惑。
我正在尝试追踪“快速排序”算法的第一步,以将枢轴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。没有交换。
这是如何工作的?将枢轴S [1](17)移到正确位置需要10次比较和4次交换吗?
答案 0 :(得分:0)
快速排序将具有两个移动指针和一个枢轴指针
,这些移动指针的初始位置将是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
^ \#^