Изменение метода stati c для добавления двух счетчиков при сравнении массивов с использованием циклов for в Java - PullRequest
1 голос
/ 18 июня 2020

Используя этот сегмент кода, который у меня уже есть, я хочу изменить метод selectionSort, чтобы иметь два счетчика: один для количества сравнений, а другой - для количества обменов данными. Каждый раз, когда сравниваются два элемента данных (независимо от того, находятся ли элементы в правильном порядке - мы заинтересованы в том, чтобы сравнение вообще проводилось), увеличивайте счетчик сравнения. Каждый раз, когда фактически меняются местами два элемента данных, увеличивайте счетчик обмена данными.

До сих пор это то, что я пытался добавить счетчики. Однако я получаю сообщение об ошибке «Неразрешенная проблема компиляции: счетчик не может быть преобразован в переменную».

public static void selectionSort(double[] list) {
      for (int i = 0; i < list.length - 1; i++) {
      // Find the minimum in the list[i..list.length-1]
      double currentMin = list[i];
      int currentMinIndex = i;
      int counter = 0;

      for (int j = i + 1; j < list.length; j++) {
        if (currentMin > list[j]) {
          currentMin = list[j];
          currentMinIndex = j;
        }
      }

      // Swap list[i] with list[currentMinIndex] if necessary;
      if (currentMinIndex != i) {
        list[currentMinIndex] = list[i];
        list[i] = currentMin;
      }
      counter += 1;
    }

      System.out.println("The size of the sorted array is " + list.length + " and the count is " + counter);
  }

У меня есть основной метод, описанный ниже.

public static void main(String[] args) {
      final int NUM_ELEMENTS = 10;

      double[] lo2Hi = new double[NUM_ELEMENTS];
      for (int i = 0; i < NUM_ELEMENTS; i++) {
          lo2Hi[i] = i + 1;
      }
      selectionSort(lo2Hi);
      double[] hi2Lo = new double[NUM_ELEMENTS];
      for (int i = 0; i < NUM_ELEMENTS; i++) {
          hi2Lo[i] = 10 - i;
      }
      selectionSort(hi2Lo);
      double[] random = new double[NUM_ELEMENTS];
      for (int i = 0; i < random.length; i++) {
          random[i] = Math.random();
      }
      selectionSort(random);
  }

1 Ответ

1 голос
/ 18 июня 2020

Ваш println() в конце selectionSort() пытается получить доступ к переменной counter, но counter находится "вне области видимости" в этот момент. Переменные существуют только в паре {}, внутри которых они были объявлены (вот что такое «область видимости»).

Переместите оператор int counter = 0; из for l oop и поместите это в верхней части метода. Тогда он будет включен в оператор печати. ​​

...