为什么分区方法的循环体永远不会抛出ArrayIndexOutOfBounds异常?
public static int partition( int[] a, low, high ) {
int k = low, m = low;
/* loop invariant:
* low <= k <= m <= high and
* all elements in a[low..k-1] are RED (i.e., < pivot) and
* all elements in a[k..m-1] are BLUE (i.e., >= pivot)
*/
while (m != high) {
if (a[m] >= pivot) // a[m] is BLUE
{ }
else { // a[m] is RED
swap(a,k,m);
k = k+1;
}
m = m+1;
}
return k;
}
答案 0 :(得分:0)
// m <= high (loop invariant)
while (m != high) {
// m < high, hence correct index
a[m] ...
m = m + 1;
// m <= high (loop invariant)
}
心灵交换不会改变m。也许你认为k和m在哪里交换,但可能是[k]和[m]。由于m是局部int变量,因此int按值传递。
即使m和k在哪里交换:m <=高
循环不变量k <= m是helt:
// k <= m
if (...) {
swap(a, k, m);
// m <= old m // if call-by-reference
k = k + 1;
// k - 1 <= m if call-by-value
}
m = m + 1;
// k <= m again; if call-by-value