2013-04-05 2 views
3

У меня есть домашнее задание кодирования двунаправленного типа пузырьков. Может кто-нибудь, пожалуйста, посмотрите, правильна ли моя логика в отношении этого. Я не хочу код, как я хочу сам понять. Мне просто нужна логическая проверка того, как я это понимаю.Двунаправленная сортировка пузырьков C#

Поскольку я понимаю двунаправленную сортировку пузырьков, вы реализуете 2 для петель, начиная с позиции 1 в списке и выполняющей обычную сортировку пузырьков. По мере того, как первый цикл цикла достигает конца, второй реализуется в обратном порядке. Я просто не совсем понимаю, какие условия завершения для каждого цикла будут.

Могут ли условия цикла для контура быть чем-то следующим?

петля 1 - for(i = 0; i < Count -i; i++)

петля 2 - for(j = Count - i; j > i; j--)

в каждом цикле будет указаны условия замены.

Благодаря

+0

Удивительный сорт видео: http://www.youtube.com/watch?v=SJwEwA5gOkM –

+0

Вероятно, это скорее вопрос http://programmers.stackexchange.com/ или http://codereview.stackexchange.com/. –

+0

@TiesonT. Хотя «программисты» были бы хорошо подходят, «codereview» требует полной, рабочей, части кода, созданной OP. – dasblinkenlight

ответ

3

«Классический» пузырьковая сортировка проходит через весь массив на каждой итерации, поэтому петли должны быть

for(i = 0; i < Count - 1; i++) 

и

for(j = Count - 1; j > 0; j--) 

Обе петли пропустить один индекс: первый цикл пропускает последний индекс, а второй цикл пропускает начальный. Это так, чтобы ваш код мог безопасно сравнить data[i] с data[i+1] и data[j] до data[j-1].

РЕДАКТИРОВАТЬ"optimized" пузырьковой сортировки пропускает начальные k элементы на k -й итерации. Так как ваша пузырьковая сортировка является двунаправленной, вы будете в состоянии пропустить начальные k и хвост k элементов, например:

int k = 0; 
do { // The outer loop 
    ... 
    for(int i = k; i < Count - k - 1; i++) 
     ... 
    for(int j = Count - k - 1; j > k ; j--) 
     ... 
    k++; 
} while (<there were swaps>); 
+0

Итак, обратная итерация не зависит от того, где был первый цикл? Он всегда переходит в позицию 1, хотя цикл 1 уже проверял их? – user2046257

+1

@ user2046257 Правильно, потому что первый цикл может иметь перемещаемые элементы в той части массива, которую он проверил. Это часть причины неэффективности сортировки пузырьков. – dasblinkenlight

+1

Технически после первых проходов (то есть вверх и вниз) вам больше не нужно проверять первый или последний элемент, так как они известны чтобы быть самым низким и самым высоким. Поэтому мне не всегда нужно начинать с 0, а j не всегда нужно заканчивать на 0. – Xantix

2

двунаправленной пузырьковая сортировка работает следующим образом:

вместо передачи списка из нижних наверху каждый раз (сортировка пузыря) вы начинаете один раз в нижней части и каждый второй раз сверху из списка.

статья википедии делает путь лучше при объяснении его:

http://en.wikipedia.org/wiki/Cocktail_sort

- богатый

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