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

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

我不明白为什么。

最佳答案

使用类变量时,请考虑以下事项:

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 变量,因此您不会遇到这个问题。

关于java - 字段变量产生与递归局部变量不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14921763/

相关文章:

c# - VB.Net 'Overridable' 对成员变量声明无效

powershell - 全局变量用例

java - 将 Maven 依赖项复制到 webapp 目录

java - Java 中 JTable 的两个单元格之间的乘法

java - 为什么当我使用 'synchronized' 时我的线程没有一个接一个地执行?

c - 如何在 C 语言中正确舍入 double ?

java - Spring Batch - 步骤不再执行 : Step already complete or not restartable

objective-c - 使用表示变量名称的字符串来设置变量

c++ - gcc 插件 c c++ 查找全局非静态变量

php - PHP-在MySQL函数中使用HTML表单函数中的变量在另一个函数中查询