2013-05-05 3 views
1

У меня возникли проблемы с подсчетом количества сравнений для mergesort в Java. Ниже мой код. Не уверен, помещаю ли я его в неправильное место и т. Д.

Любая помощь, безусловно, ценится, спасибо.Подсчет количества сравнений для MergeSort Java

private static int merge(int[] intArray, int first, int n1, int n2) { 
    int numComparisons = 0; 
     int[] temp = new int[n1+n2]; 
     int copied = 0, copied1 = 0, copied2 = 0; 
     while((copied1 < n1) && (copied2 < n2)){ 
      if (intArray[first + copied1] < intArray[first + n1 + copied2]) { 
       temp[copied++] = intArray[first + copied1++]; 
      } 
      else { 
       temp[copied++] = intArray[first + n1 + copied2++]; 
      } 

     } 

     while(copied1 < n1)  { 
      temp[copied++] = intArray[first + copied1++]; 
     } 
     while(copied2 < n2)  { 
      temp[copied++] = intArray[first + n1 +copied2++]; 
     } 


     for(int i = 0; i < n1+n2; i++) { 
      numComparisons++; 
      intArray[first + i] = temp[i]; 
     } 

     return numComparisons; 
    } 


    public static int mergeSortComparisons(int[] intArray, int first, int last){ 
     int n1, n2; 
     if (last > 1){ 

      n1 = last/2; 
      n2 = last - n1; 

      mergeSortComparisons(intArray, first, n1); 
      mergeSortComparisons(intArray, first + n1, n2); 

      merge(intArray, first, n1, n2); 
     } 

     return first; 
    } 

ответ

1

Если вы хотите посчитать количество сравнений, сделайте шаг сравнения, отредактируйте его методу и примените метод. Вы увеличиваете numComparisons в неположенном месте.

private static boolean lessThan(int[] ia, int leftIndex, int rightIndex) { 
    numComparisons++; 
    return ia[leftIndex] < ia[rightIndex]; 
} 

Используйте, что вместо вашей линии сравнения в верхней части merge.

Кроме того, напишите тесты JUnit, чтобы убедиться, что ваш вид работает. Наконец, вам нужно, чтобы все ваши методы были статичными?

+0

Куда я могу поместить его в текущую функцию? Мой учитель не позволяет нам делать для этого отдельные функции. @ eric-jablow – 2013-05-05 21:45:24

+0

Затем вставьте 'numComparisons ++' прямо над оператором if, так как это единственное место, где вы фактически сравниваете две записи. Текущее местоположение служит для подсчета количества перемещений целых чисел, что вам не нужно. –

Смежные вопросы