2016-04-12 7 views
-1

Я изучаю эту книгу со вчерашнего дня, и после того, как я понял и применил первый алгоритм, я попытался пойти самостоятельно и посмотреть по-другому. Вот, в Java, показанный алгоритм:Почему мой алгоритм сортировки быстрее, чем в книге «Введение в алгоритмы» в книге Х. Кормена?

public static int[] sort(int[] array) 
{ 
    for(int i = 1; i < array.length; i++){ 
     int value = array[i]; 
     int j = i - 1; 

     while(j >= 0 && array[j] > value){ 
      array[j + 1] = array[j]; 
      j--; 
     } 
     array[j+1] = value; 
    } 

    return array; 
} 

А вот мой:

public static int[] sortb(int[] array) 
{ 
    for(int i = 0; i < array.length; i++){ 
     int value = array[i]; 
     int j = i; 

     while(j < array.length && value > array[j]){ 
      array[j] = array[j + 1]; 
      j++; 
     } 

     array[j] = value; 
    } 

    return array; 
} 

1 млн вызова функции для каждого, я получил 32 мс для первого и 25 мс для второго , Я все еще начинаю с алгоритмов, поэтому я понятия не имею о значении.

+0

Это не имеет никакого значения. Я потратил больше времени на то, чтобы сосредоточиться на алгоритмах и меньше на измерении их скорости. Если вы не знаете, как правильно выполнять измерения, вы можете получить всевозможные результаты и тратить свое время, пытаясь найти смысл там, где нет смысла. – Kayaman

+0

@FarazDurrani Я почти уверен, что преподаватели преподают алгоритмы, их больше интересует «Большой O», чем миллисекунды, полученные плохими измерениями. – Kayaman

+0

Я не работаю с профессором, но сам по себе – Despirithium

ответ

6

Я нашел, почему ваш вид намного быстрее оригинального: потому что вы вообще не занимаетесь.

В коде

int value = array[i]; 
    int j = i; 

    while(j < array.length && value > array[j]) { ... } 

Поскольку j = i, так value == array[j], прежде чем попасть в петлю в то время, и, таким образом, ваше тело цикла в то время как никогда не выполняться. Результат сортировки будет неправильным. Это основная причина, по которой ваш код работает очень быстро.

+0

Ну, мне стыдно. Спасибо, что заметили это! – Despirithium

+0

необходимо проголосовать .... –

5

В моем опыте (см. опыт ученика), этот вид разных значений имеет мало смысла.

Возможно, у вас был фоновый процесс, который взял/выпустил немного больше ресурсов из одного в другой.

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

Может быть, если вы использовали различные случайные массивы, один из них был ближе к сортироваться, чем другие ..

Чтобы иметь хорошие меры, как правило, вы должны сделать много испытаний, а не только один. Так, например, генерирует 1k 10k массивы элементов, каждые и сортировка каждый из этого массива с обеими алгоритмами ..

В любом случае, иногда специфическими особенностями языка или компилятор может генерировать разные результаты для алгоритмов с теоретически точно такими же сложностями (один пример: как только я заметил в C++, если вы пересекаете двумерный массив сначала по столбцам, а затем по строкам, у вас будет совсем другая скорость, чем если бы вы сделали это наоборот, но я не помню, какой из них был быстрее tbh).

+1

Если вы имеете в виду 'a [10] [10]' такой двумерный массив C++, он будет быстрее, если вы пройдете с внешним циклом: 'a [0-9]', а внутренний цикл - 'a [i] [ 0-9] ', потому что' a [i] [0-9] 'должен быть последовательно помещен в память. – Nier