对数据集进行快速排序时,列表会被分解并递归,因为解决方案会在较小的列表上调用自身。 我在算法上练习快速排序,但是长度为2的子列表在我的鞋子上是一块石头,我无法解决。原始列表是:
2 0 1 7 4 3 5 6
从2开始,在0在左边,在6在右边。左移至7、7> = 2。右移到1,1 <= 2。左右交叉。据我了解,现在权已成为分裂点,并形成了两个新列表。
2 0 1 7 4 3 5 6
如您所见,第一个列表2和0长2个项目。所以2是枢轴,而0既是左侧又是右侧。左侧不移动,右侧移动到2、2 <= 2。左右交叉,因此p取代R和L成为新列表。但这留下2和0未排序。
我要去哪里错了?
答案 0 :(得分:0)
您遇到的问题是由于我没有在其排序位置移动数据透视表。在使用透视图2
进行分区之后,您的数组应如下所示:
0 1 2 7 4 3 5 6
^
让我们使用输入数组partition
来完成13 19 9 5 12 8 7 4 21 2 6 11
过程。让我们选择11
作为支点。
在此过程中,您需要维护两个指针,一个指向刚好大于枢轴^^
的第一个元素之前的元素,另一个指向您正在查看的||
的指针。 / p>
代码如下:
A is array left..right
pivot = A[right]
i = left - 1 // the one before the first bigger than the pivot
for j = left to right - 1
if A[j] <= pivot
i = i + 1
swap A[i] with A[j]
swap A[i+1] with A[right] // put pivot at its place, i + 1 - is the index to split on
和示例:
13 19 9 5 12 8 7 4 21 2 6 11
13 19 9 5 12 8 7 4 21 2 6 11 13 > 11, skip
^^ ||
13 19 9 5 12 8 7 4 21 2 6 11 19 > 11, skip
^^ ||
9 19 13 5 12 8 7 4 21 2 6 11 9 < 11, swap
^^ ||
9 5 13 19 12 8 7 4 21 2 6 11 5 < 11, swap
^^ ||
9 5 13 19 12 8 7 4 21 2 6 11 12 > 11, skip
^^ ||
9 5 8 19 12 13 7 4 21 2 6 11 8 < 11, swap
^^ ||
9 5 8 7 12 13 19 4 21 2 6 11 7 < 11, swap
^^ ||
9 5 8 7 4 13 19 12 21 2 6 11 4 < 11, swap
^^ ||
9 5 8 7 4 13 19 12 21 2 6 11 21 > 11, skip
^^ ||
你能继续自己吗?
答案 1 :(得分:0)
快速排序算法只有空数组或大小为 1 的数组的基本情况。在您的 [2 0] 情况下,算法选择 2 作为主元,将 [2 0] 划分为空数组和数组 [0] 和将其与枢轴 [2] 合并,得到排序数组 [0 2]。