我在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:在这种情况下忽略优化,或者选择枢轴和所有这些东西,请。
答案 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)
i
和j
从数组的任一端开始,直到找到的值大于数据透视(a[i]
)且小于数据透视(a[j]
)。当找到两个这样的值时,它们是交换的位置,因此您最终会得到一个数组,其中循环i
到结尾之后的数字大于数据透视图,并且j
的开头小于数据透视表。比我们对这两个子阵列进行递归。
i>j
除以透视值。 i
和j
已覆盖数组中的每个值,以确保它位于数据透视的正确一侧。这可能发生在数组的中间或仅在交换一个值之后,具体取决于数据透视值在列表中的位置。枢轴可以是最大值或最小值,也可以在值列表的中间位置。