2013-10-02 6 views
0

Я закодировал 2 алгоритма bubblesort. Один из них без рекурсии, другой - с рекурсией. Мне интересно узнать, какие из этих двух более эффективны и с чем объяснить и почему.Рекурсивный BubbleSort против обычного BubbleSort

Рекурсивного BubbleSort:

private static int list[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; 

public int[] recursiveBubble(int[] args, int startIndex, int endIndex) { 
    if(startIndex > endIndex){ 
     System.out.println("Recursive bubblesort:"); 
     System.out.println(Arrays.toString(args)); 
     return args; 
    } 

    if (startIndex == endIndex - 1) { 
     recursiveBubble(args, 0, endIndex - 1); 
    } else if (args[startIndex] > args[startIndex+1]) { 
     int currentNumber = args[startIndex]; 
     args[startIndex] = args[startIndex + 1]; 
     args[startIndex + 1] = currentNumber; 

     recursiveBubble(args, startIndex + 1, endIndex); 
    } else { 
     recursiveBubble(args, startIndex + 1, endIndex); 
    } 
    return args; 
} 

BubbleSort с помощью петли:

public int[] bubblesort(int[] args) { 
    System.out.println("Normal BubbleSort:"); 
    for (int j = 0; j < args.length; j++) { 
     for (int i = 0; i < args.length; i++) { 
      int currentNumber = args[i]; 
      if (i + 1 < args.length) { 
       if (currentNumber > args[i + 1]) { 
        args[i] = args[i + 1]; 
        args[i + 1] = currentNumber; 
       } 
      } 
     } 
    } 
    System.out.println(Arrays.toString(args)); 
    return args; 
} 
+0

Возможный дубликат: http://stackoverflow.com/questions/72209/recursion-or-iteration –

+2

Это не форум для такого вопроса - попробуйте [Обзор кода] (http://codereview.stackexchange.com /). –

+0

@SimonArsenault стоит отметить, что javac не выполняет оптимизацию хвостовой рекурсии и что вышеупомянутый метод не является хвостовым рекурсивным в любом случае. –

ответ

3

Я не уверен, что вы имеете в виду, что лучше, но пузырьковая сортировка должна по своей сути есть лучшее и худший показатель случая время по характер способа работы алгоритма. Наилучший случай O (n) наихудший случай O (n^2) см. http://en.wikipedia.org/wiki/Bubble_sort. Итерация против рекурсии не должна слишком сильно отличаться. Я предполагаю, что рекурсия займет больше памяти стека. Рекурсия, как правило, сложнее писать и отслеживать, чем итерация. Поскольку нет никакой пользы от времени, если оба являются реальными реализациями пузырьковой сортировки, я буду придерживаться итерации.

+0

Хорошо, ну в основном я имею в виду, какой из них выполняется быстрее всего. Так как я не могу узнать на netbeans время выполнения. Он просто скажет 0 секунд. Поэтому я просто хочу знать, какой из них достигает цели быстрее всего во время выполнения. – JP24

+0

Хотя вы правы в том, что производительность алгоритма с лучшим случаем и наихудшим случаем не изменится. – JP24

+0

Если вы правильно его закодировали, разница должна быть незначительной. Попробуйте запустить его на огромном наборе данных и профилировании, но я был бы удивлен, увидев большую разницу. Это домашнее задание? http://stackoverflow.com/questions/895371/bubble-sort-homework?rq=1 –

-1

В приведенном выше примере вы более менее заменяете циклы на рекурсию. В java рекурсивной версии, возможно, не очень хорошо, потому что это может привести к ошибке stackoverflow на основе длинной длины массива. сложность мудрая Я не вижу никакой разницы. ЕСЛИ вы сравниваете управление памятью JVM, тогда рекурсивная версия займет больше места в памяти, чем ваш обычный цикл. если вы увеличиваете длину переменной, вы можете заметить эту разницу или вы можете столкнуться с исключением stackoverflow на основе выделенного размера для ваших поколений памяти.