字段变量与递归的局部变量产生不同的结果

时间:2013-02-17 13:50:16

标签: java variables global-variables

我有这个非常奇怪的问题,我不知道为什么。

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);

我不明白为什么。

2 个答案:

答案 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变量,所以你没有这个问题。