我有这个非常奇怪的问题,我不知道为什么。
public class QuickSort
{
private int pivLocation;
private void quickSort(Integer[] input, int low, int high)
{
if(low < high)
{
this.pivLocation = partition(input, low, high);
quickSort(input, low, pivLocation-1);
quickSort(input, pivLocation+1, high);
Inversions.comparisons += high - low;
}
}
}
private int partition(Integer[] input, int low, int high)
{
int arrLength = high - low;
if(arrLength%2 == 0){
int pivot = input[low];
}
else
{
int pivot = 1;
}
int i = low+1;
for(int j=low+1; j<= high; j++ )
{
if(input[j]< pivot)
{
swap(input, j, i);
i++;
}
}
swap(input, low, i-1);
return i-1;
}
与编写完全相同的代码相比,这给出了不同的比较计数,但不是使用字段变量,而是将pivLocation转换为局部变量。
int pivLocation = partition(input, low, high);
我不明白为什么。
答案 0 :(得分:3)
由于递归。每次调用方法时都会初始化局部变量。
当你有:
int var;
void mymethod() {
mymethod();
}
var
仅初始化一次。
是
void mymethod() {
int var;
mymethod();
}
每次调用var
时, mymethod()
都会被初始化(设置为零),因为变量范围在方法中是有限的。
答案 1 :(得分:3)
使用类变量时,请考虑以下内容:
pivLocation = partition(input,low,high);
// pivLocation changes in this function (specifically to a lower value)
quickSort(input, low, pivLocation-1);
// pivLocation is now lower than expected
quickSort(input, pivLocation+1, high);
因此调用第二个quickSort
的索引可能包含已经排序的元素。因此,比较的数量将高于所需的数量。
当你使用局部变量时,每个递归调用都有它自己的pivLocation
变量,所以你没有这个问题。