我们正在学习quickSort。这本书提供了我的问题末尾的代码。
我对findPivot方法结束时的这个调用感到好奇:
swap(array, left++, right--);
为什么那里有“++”和“ - ”?它不是递增/递减任何一个变量(在交换之前或之后)并且它不访问(例如)数组[left + 1]。
那是什么给了什么?
修改 的
所以在我发布问题之前,我写了以下测试代码:
public static void main(String[] args) {
int a = 0;
int b = 2;
int[] array = {1,10,20,30};
swap(array, a++,b--);
}
public static void swap(int[]array,int a, int b)
{
for(int i = 0; i < 10; i++)
{
Integer temp = array[a];
array[a] = array[b];
array[b] = temp;
System.out.println("a = " + a + "\nb = " + b + "\narray a: " + array[a] + "\narray b: " + array[b]);
}
结果如下:
a = 0 b = 2 数组a:20 数组b:1 a = 0 b = 2 数组a:1 阵列b:20 a = 0 b = 2 数组a:20 数组b:1
在方法中使用时,变量根本不会后递增。这就是我问这个问题的原因。
感谢。这是代码:
private static void swap(Integer[] array, int i, int j)
{
Integer temp = array[i];
array[i] = array[j];
array[j] = temp;
}
public static void quickSort(Integer[] array, int left, int right)
{
if(left < right)
{
int pivot = findPivot(array, left, right);
quickSort(array, left, pivot - 1);
quickSort(array, pivot + 1, right);
}
}//quickSort
public static int findPivot(Integer[] array, int left, int right)
{
int first = left++;
while (left <= right)
{
while (left <= right && array[first].compareTo(array[left]) > 0)
{
left++;
}
while (left <= right && array[first].compareTo(array[right]) < 0)
{
right--;
}
if (left < right)
swap(array, left++, right--);
}
swap(array, first, right);
return right;
}
答案 0 :(得分:6)
post-increment (§15.14.2)(++
)和post-decrement (§15.14.3)(--
)操作。这些将改变while循环中下一次迭代的值。
你基本上有这个:
while (left <= right)
{
// ...
if (left < right)
{
swap(array, left, right);
left++;
right--;
}
}
如您所见,“post”表示该特定语句的值不受影响。在评估后增量操作后,它将增加变量,但传递给方法的值仍然是旧的。对于高级读者,您可以像这样编写后增量运算符(伪代码):
public int operator this++()
{
int temp = this;
++this; // regular pre-increment (JLS §15.15.1)
return temp;
}
有关预增量运算符的读数,您可以检查JLS §15.15.1。
答案 1 :(得分:6)
swap(array, left++, right--);
位于while
循环内,因此更新后的值将用于下一循环迭代。
答案 2 :(得分:1)
java increment(++
)和递减(--
)
假设i++;
这意味着i+1
而i--
意味着i-1
在编程
int i = 1;
System.out.println("i : "+(i++)); // this means first print then add `1` into i;
//and
System.out.println("i : "+(++i)); // this means first add one and then print it;
// same for '--'
答案 3 :(得分:0)
它们是后递增(++)和后递减( - )操作,因此它们将在while循环中更改下一次迭代中的值
在此行的代码中
swap(array, left++, right--);//left++ , right-- are post increment (++) and post decrement (--) operation