【问题标题】:I don't understand this quicksort implementation我不明白这个快速排序实现
【发布时间】:2013-10-09 18:39:45
【问题描述】:

我有一个 C++ 中的快速排序代码,它非常适用于一组非唯一元素。我相信这里很多人都知道,但是,谁知道呢?让我更好地解释一下自己。这是代码:

void quicksort(int a[], int first, int last){
    int i,j;
    int pivot;

    if((last -first + 1) <= 1) return;

    pivot = a[(first+last) / 2];
    i = first;
    j = last;

    while(i <= j){
        while(a[i] < pivot) i++;
        while(a[j] > pivot) j--;

        if(i <= j){
            //SWAP
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;

            i++;
            j--;
        }
    }

    quicksort(a, first, j);
    quicksort(a,i, last);
}

所以,我理解除了交换中的 if 之外的所有内容。谁能在数学上告诉我,在两个内部时间之后 i > j 的确切情况或一组情况是什么?我知道它的具体情况,但是它们发生的数学(或精确)属性是什么?

对不起,糟糕的英语,谢谢。

PD:请忽略这种情况下的优化,或者选择枢轴和所有这些东西。

【问题讨论】:

  • 这看起来像 C 代码,而不是 C++?
  • 我认为swap函数来自C++,不是吗?
  • 在 C++ 中有 std::swap,但如果没有看到其余代码,很难知道这里使用的是什么交换实现。
  • 我认为这不是严格意义上的 C 但还好,我编辑了标题,现在我们可以深入了解它了吗?
  • @PaulR 除了使用swap() 函数(假设它的std::swap())之外,这是同时具有良好C 和良好C++ 代码的示例。

标签: c++ duplicates quicksort elements


【解决方案1】:

如果在开始时 a[i] > pivot (所以 i 不会改变)并且 a[j] > pivot 对所有 j 直到 a[j] = pivot ,循环的下一次迭代将导致 a j 的情况

为了说明……

取以下数组:

int a[] = [10, 7, 2, 6, 3];

在第一次调用快速排序时,first 为 0,last 为 4(数组中的最后一个索引),pivot 将为 a[2] = 2。在第一次迭代中,如果 while 循环,a[0] > 2,所以我没有改变。 a[4] > 2, j--, a[3] > 2, j--, a[2] = 2,现在我们点击 if 语句。 0

现在数组看起来像这样:

[2, 7, 10, 6, 3]

其中 i = 1 和 j = 1。a[i] > 2,所以 i 不会改变。 a[j] > 2,所以 j--,j 现在是 0。a[j] 不大于 2(因为它是 2),j 保持在 0。现在,我们有 i = 1 和 j = 0 , 或 i > j。

如果您注意到,2 处于“已排序”位置,不再需要移动。此外,枢轴是数组中的最小元素。希望对你有所帮助。

【讨论】:

  • 就是这个!谢谢你:)
【解决方案2】:

ij 从数组的任一端开始,直到它们找到大于枢轴 (a[i]) 且小于枢轴 (a[j]) 的值。当找到两个这样的值时,它们会被交换位置,因此您最终会得到一个数组,在循环之后i 到结尾大于枢轴,而j 的开头小于枢轴。比我们递归这两个子数组。

i&gt;j 列表完成后除以枢轴值。 ij 已经覆盖了数组中的每个值,以确保它位于枢轴的正确一侧。这可能发生在数组的中间,或者根据枢轴值在列表中的位置仅交换一个值之后。枢轴可以是最大值或最小值,也可以位于值列表的中间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2013-08-09
    相关资源
    最近更新 更多