一组长度为2的Quicksort

时间:2019-05-10 11:09:03

标签: algorithm sorting quicksort

对数据集进行快速排序时,列表会被分解并递归,因为解决方案会在较小的列表上调用自身。 我在算法上练习快速排序,但是长度为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未排序。

我要去哪里错了?

2 个答案:

答案 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]。