2016-05-11 6 views
3

Первое:Какой вид пузыря?

for(int i=0;i<n-1;i++) 
    for(int j=n-1; j>i;j--) 
    if(a[j] < a[j-1]) 
     swap(a[j], a[j-1]); 

или второй:

for(int i=0; i<n-1; i++) 
    for(int j=i+1; j<n; j++) 
    if(a[j] < a[i]) 
     swap(a[j],a[i]); 

или третья версия:

int temp, i, j = 0; 
    boolean swaped = true; 

    while (swaped) { 
     swaped = false; 
     j++; 
     for(i = 0; i < arr.length - j; i++){ 
      if(arr[i] > arr[i+1]){ 
       temp = arr[i]; 
       arr[i] = arr[i+1]; 
       arr[i+1] = temp; 
       swaped = true; 
      } 
     } 
    } 

Кто-то говорят, что первым и кто-то сказал второй. Итак, какой из них прав? Кто-то говорит, что второй - это взаимозаменяемость. Многие книги говорят, что «пузырь» - это третья версия, но многие люди называли первую версию пузырьковой сортировкой. Есть комментарии?

+0

Третья версия - это странно. Разве это даже сортировка? –

+0

@MichaelDorgan: Это обычная оптимизация для сортировки пузырьков –

+0

Угадайте, я давно не использовал ее :) Интересно, почему? –

ответ

1

Я проверил оба фрагмента кода в реальном массиве, используя Java в IntelliJ. Обе версии генерировали массив в порядке возрастания сортировки.

Вот массив, который я использовал:

int[] a = {1, 9, 3, 5, 4, 2, 8, 6, 7}; 

А вот выход из двух версий:

Version 1

[1, 2, 3, 4, 5, 6, 7, 8, 9] 

Version 2

[1, 2, 3, 4, 5, 6, 7, 8, 9] 

Первая версия выглядит как стандартный вид пузыря, а вторая версия - это нечто другое.

+0

Я получаю правильный вывод для второй версии: http://ideone.com/Nn2uT6 – fgb

6

Первая версия - это сортировка пузырьков, потому что она сравнивает каждую пару смежных элементов.

Вторая версия - это сортировка, потому что a[i] заканчивается наименьшим элементом в несортированной правой части массива после каждой итерации внешнего цикла.

+0

Вы уверены, что любой из них является сортировкой? Я думал, что сортировка сортировки прошла через несортированную часть массива, найдя наименьший элемент и переместив его в начало несортированного раздела, а затем уменьшив размер несортированного раздела на единицу. –

+0

@JonathanLeffler Это не совсем то же самое. Состояние такое же, как сортировка выбора для каждой внешней итерации, но есть некоторые дополнительные избыточные свопы. Он по-прежнему находит наименьший элемент, но он меняет наименьшее количество найденных до сих пор несколько раз, а не один раз в конце. Я думал, что это может быть вариант выбора пузырьков, но я думаю, что для создания пузырьков требуется замена соседних элементов. – fgb

+0

Есть элемент «Я не совсем уверен, почему меня беспокоит» (поскольку они все медленны и не особенно полезны), но есть также элемент «Я бы хотел, чтобы это было правильно». Вы увидите в комментариях к основному вопросу, что, по моему мнению, первый - это сортировка вставки, вторая - сортировка пузырьков, а третья - модифицированная сортировка пузырьков. Я все еще думаю, что ни один из них не является сортировочным; см. статьи Википедии, приведенные в моих комментариях к вопросу. (Я также ошибался в первом из этих комментариев - я не претендую на совершенство здесь!) –

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