2014-09-30 4 views
1

Я пишу 2 разных вида, один выбор другой вставка. Ниже приведен мой метод сортировки вставкиКак подсчитать сравнения в сортировке и сортировке?

public static void iSort(String[] array) 
{ 
    int i, j, k; 
    String temp; 
    for(i = 1; i<array.length; i++) 
    { 
    k=i; 
    for(j = k-1; j>=0 && array[j].compareTo(array[k])>0; j--) 
    { 
    ccounter++; 
    temp = array[j]; 
    array[j] = array[k]; 
    array[k] = temp; 
    k--; 
    } 
    } 
} 

где ccounter - это статическая переменная класса. Когда я тестирую это, используя массив строк из 1000 элементов, я получаю значение 239507. Однако, когда я тестирую с правильно упорядоченным массивом строк, я получаю нулевое значение, которое, как я знаю, неверно, так как наилучшая производительность n сравнений для n условий. Интересно, неправильно ли написан мой метод или если счетчик помещен неправильно

+0

вы подсчетом свопов, а не сравнение. (т. е. вы не считаете сравнение, результатом которого является '<= 0') – njzk2

+0

Во внутреннем цикле for перемещайте сравнение внутри цикла for. В настоящее время вы считаете, только когда вам нужно поменять местами. Если сравнение выполняется внутри цикла, вы будете считать все сделанные сравнения. – arunmoezhi

+0

@arunmoezhi. Это означает, что вы принимаете условие из круглых скобок и помещаете их в фактическое тело цикла? – rubikscube09

ответ

1

Проблема в том, что если вы выйдете из цикла, потому что compareTo() вернул false, вы не считаете это окончательное сравнение.

Если бы я писал это, я бы обернул код сравнения в функцию, которая вызывала бы compareTo() и увеличивала счетчик. Затем я использовал бы эту функцию обертки, чтобы выполнить все сравнения. Таким образом, нет никаких ошибок в расчете.

0

приращение счетчика для каждого выполнения внутреннего цикла и сделать сравнение после того, как приращение счетчика

public static void iSort(String[] array) 
{ 
    int i, j, k,ccounter=0; 
    String temp; 
    for(i = 1; i<array.length; i++) 
    { 
     k=i; 
     for(j = k-1; j>=0; j--) 
     { 
       ccounter++; //increment counter for every execution of inner loop 
       //better to do integer comparison than string comparison 
       if(Integer.parseInt(array[j]) <= Integer.parseInt(array[k])) 
       { 
        break; 
       } 
       temp = array[j]; 
       array[j] = array[k]; 
       array[k] = temp; 
       k--; 
     } 
    } 
} 
+0

Ты был потрясающим, не можешь поблагодарить тебя – rubikscube09

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