2015-04-13 3 views
1

Я понимаю, что алгоритм Stooge сортировки работает следующим образом:время выполнения модифицированного Stooge сортировки Алгоритм

Step 1: If the value at the end is smaller than the value at the start, swap them. 
Step 2: If there are 3 or more elements in the list, then: 

     Stooge sort the initial 2/3 of the list 
     Stooge sort the final 2/3 of the list 
     Stooge sort the initial 2/3 of the list again 

     else: exit the procedure 

Я также понимаю, что время выполнения марионетки рода О (п^(срубы 3/Журнал 1.5)).

Из любопытства, какова была бы продолжительность в нотации Big O, если бы мы полностью вытащили Шаг 1 и условие if на шаге 2 (при условии, что размер массива всегда будет делиться на три)?

+1

Если вы удалили шаг 1, время выполнения было бы бесконечным. –

+0

@JohnDeters Как это возможно? Бесконечное время выполнения подразумевает, что алгоритм никогда не заканчивается, таким образом, не работает без шага 1. Я не уверен, почему требуется Шаг 1, поскольку алгоритм сортируется просто с шага 2. –

+0

@JoffreyBaratheon Время выполнения не будет бесконечным, но ничего не закончится. Если вы уроните этот шаг, ничто никогда не поменяется местами. :-) – templatetypedef

ответ

0

На шаге 2 вам все еще нужно какое-то условие для не вызов stooge сортировать рекурсивно. В противном случае сортировка массива длиной 10 вызывает сортировку массива длиной 10 * 2/3, который вызывает сортировку массива длиной 10 * 2/3 * 2/3, ... который после нескольких шагов таким образом, вызовы сортируют массив длиной 0, который в свою очередь вызывает сортировку массива длины 0 снова и так далее бесконечно.

На шаге 1 вам все равно необходимо выполнить некоторую фактическую работу. В противном случае эту функцию можно назвать сортировкой, перетасовкой и т. Д., Но на самом деле бесполезно, поскольку нет шага, который меняет любые значения.

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

+0

Нет, я говорю, что размер массива всегда делится на 3. Я не уверен, видел ли вы редактирование, которое я сделал. Независимо от того, будет ли это работать, я прошу, для чего будет использоваться время выполнения в большой нотации O: сортировка первого массива 2/3, последнего 2/3 массива, а затем сначала 2/3, снова. Я предполагаю, что время выполнения останется прежним. –

+0

@JoffreyBaratheon Просьба привести пример начального размера массива, чтобы его размер и размеры его частей в каждом рекурсивном вызове делились на 3. Единственный размер, о котором я могу думать, равен 0, а алгоритм , измененный, как вы предлагаете, все еще рекурсивно называет себя бессрочно на нем. – Gassa

+0

Если мы отсортизируем первые 2/3, последние 2/3 и первые 2/3 на следующем массиве [7, 4, 6, 2, 9, 5, 8, 1, 3], он полностью сортирует его. –