我不明白这个quicksort实现

时间:2013-10-09 18:39:45

标签: c++ duplicates quicksort elements

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

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之外的一切。任何人都可以用数学方式告诉我,确切的案例或案例集是什么? j后两个内心的时间?我知道它的具体情况,但它们的数学(或精确)属性是什么?

抱歉蹩脚的英语,谢谢。

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

2 个答案:

答案 0 :(得分:1)

如果,当开始时,a [i]&gt;枢轴(所以我没有改变)和[j]&gt;对于所有j的枢轴,直到[j] =枢轴,循环的下一次迭代将导致j <1的情况。岛

说明......

采取以下数组:

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

在第一次调用quicksort时,第一个为0,最后为4(数组中的最后一个索引),pivot将为[2] = 2.在第一次迭代中,如果是while循环,则为[0]&gt; ; 2,所以我没有改变。 a [4]&gt; 2,j--,a [3]&gt; 2,j--,a [2] = 2,现在我们点击了if语句。 0 <= 2,所以我们交换[0]和[2]并执行i ++和j - 。

现在数组看起来像这样:

[2, 7, 10, 6, 3]

i = 1且j = 1.a [i]> 2,所以我没有改变。 a [j]&gt; 2,所以j--,j现在是0. a [j]不大于2(因为它是2),并且j保持为0.现在,我们有i = 1和j = 0,或者i>学家

如果您注意到,2位于“已排序”位置,不再需要移动。此外,数据透视表是数组中最小的元素。希望能帮助你解决这个问题。

答案 1 :(得分:0)

ij从数组的任一端开始,直到找到的值大于数据透视(a[i])且小于数据透视(a[j] )。当找到两个这样的值时,它们是交换的位置,因此您最终会得到一个数组,其中循环i到结尾之后的数字大于数据透视图,并且j的开头小于数据透视表。比我们对这两个子阵列进行递归。

完成列表时,

i>j除以透视值。 ij已覆盖数组中的每个值,以确保它位于数据透视的正确一侧。这可能发生在数组的中间或仅在交换一个值之后,具体取决于数据透视值在列表中的位置。枢轴可以是最大值或最小值,也可以在值列表的中间位置。