Поэтому я занимаюсь домашней работой для CompSci 2, и задание требует, чтобы мы сортировали один стек (из пяти чисел) в порядке возрастания, используя только 3 стека - во многом как проблема Башни Ханоя, - но нет правил о том, могут быть помещены на меньшее число и т.д.
Я по сути пытаюсь выяснить процесс сортировки любого числа против другого в стеке, но я немного потерял - пытаясь сформулировать идею, я придумал это: номер стека, поместите его в другой стек (скажем, стек 3), сравните его со следующим числом в исходном стеке, а если он будет меньше, я бы поместил номер в стек 3 в стек 2. Но тогда я столкнулся с проблемой порядка - если число меньше, чем после него, но не меньше другого числа в стеке, мой конечный результат будет не в порядке.
Может ли кто-нибудь помочь мне здесь в определении метода, будет работать лучше всего?
Я тоже занимаюсь сортировкой вставки, но я нахожу @Beta ответ немного запутанным, поэтому я работал сам по себе, написанный как псевдокод.
Мы назовем три source
стека, temp
и result
. И их верхние элементы как *source
, *temp
и *result
соответственно.
Мы постараемся, чтобы стек result
всегда сортировался с самыми большими элементами внизу и наименьшим в верхней части.
While 'source' isn't empty we:
While '*source' is bigger than '*result'
put '*result' onto 'temp'.
put '*source' onto 'result'.
Put all the items from 'temp' back onto 'result'.
*source
больше, чем *result
». В настоящее время я реализую это сам, чтобы проверить это.
Я предложил бы использовать стеки 1 и 2 вместе в качестве переходящего списка, а затем применить сортировку пузырьков, используя стек 3, как временный холдинг.
Я бы сделал сортировку вставки. Стек 1 - это оригинальные, несортированные числа, стек 2 находится в порядке возрастания (последний вставленный элемент является самым большим), стек 3 находится в порядке убывания, а наименьший элемент в стеке 3 (который сверху) больше, чем самый большой элемент в стеке 2 (который также находится сверху).
Этот метод, как @AMADANONinc., Не требует памяти состояний или других переменных, и я думаю, что это быстрее.
Вызовите верхние элементы 1, 2 и 3 "A", "B" и "C" соответственно.
EDIT: Я переписал алгоритм, и я думаю, что он теперь строгий. Попробуйте эти правила в порядке, и когда вы перемещаете элемент, вернитесь к началу.
Например, предположим, что стек 1 начинается как {22,44,11,55,33} (33 сверху). По правилу 5 переместите 33 на 2. По правилу 5 переместите 55 на 2. По правилу 3 переместите 55 на 3. По правилу 3 переместите 33 на 3. По правилу 5 переместите 11 к 2. По правилу 4 переместите 33 - 2. В соответствии с правилом 5 переместите 44 к 3. По правилу 3 переместите 33 на 3. По правилу 5 переместите 22 на 2. По правилу 2 переместите 33, 44 и 55 к 2. По правилу 1 остановитесь.
Самый быстрый метод для сортировки 3 стека - это сортировка многофазного слияния. Имеет всего 5 чисел и тот факт, что 5 - многофазный дружественный номер Фибоначчи. Предположим, что стеки A, B, C и что 5 чисел изначально на A. В этом примере цифры начинаются в обратном порядке. На приведенной ниже диаграмме фронт (первый элемент) стека находится слева. Вертикальные столбцы представляют границы выполнения. Комментарии относятся к следующему шагу, который необходимо выполнить. Объединение комментариев означает объединение 1 пробега из двух стеков в третий стек.
A B C
|5|4|3|2|1| pop/push 2 from A to B
|3|2|1| |4|5| merge A + B to C ascending
|2|1| |5| |4 3| merge A + B to C descending
|1| |2 5|4 3| merge A + C to B ascending
|5 2 1| |4 3| merge B + C to A descending
|1 2 3 4 5| done
Общее количество ходов (pop/push) = 14.
Разнообразная сортировка многофазного слияния для 3 стеков несколько сложна. Первыми движущимися элементами от A до B и C (C, если количество элементов не является числом Фибоначчи), затем определяют, является ли первое слияние восходящим или нисходящим (после этого они чередуются) и отслеживание изменений размера выполнения. Если кто-то заинтересован, я могу опубликовать пример кода.