Сортировка стека в порядке возрастания? (используя только 3 стека)

0

Поэтому я занимаюсь домашней работой для CompSci 2, и задание требует, чтобы мы сортировали один стек (из пяти чисел) в порядке возрастания, используя только 3 стека - во многом как проблема Башни Ханоя, - но нет правил о том, могут быть помещены на меньшее число и т.д.

Я по сути пытаюсь выяснить процесс сортировки любого числа против другого в стеке, но я немного потерял - пытаясь сформулировать идею, я придумал это: номер стека, поместите его в другой стек (скажем, стек 3), сравните его со следующим числом в исходном стеке, а если он будет меньше, я бы поместил номер в стек 3 в стек 2. Но тогда я столкнулся с проблемой порядка - если число меньше, чем после него, но не меньше другого числа в стеке, мой конечный результат будет не в порядке.

Может ли кто-нибудь помочь мне здесь в определении метода, будет работать лучше всего?

  • 0
    Ханойская башня является своего рода подмножеством этой проблемы. Ослабьте требование для размещения дисков на Disc1 <= Disc2 и посмотрите, какой алгоритм выпадет у вас.
  • 0
    Пожалуйста, покажите свой код.
Показать ещё 5 комментариев
Теги:
sorting
stack

4 ответа

1
Лучший ответ

Я тоже занимаюсь сортировкой вставки, но я нахожу @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'.
  • 0
    Итак, при первом проходе * source всегда будет переходить к результату, так как в начале стек пуст, верно?
  • 0
    Да. На самом деле правило должно быть таким: «Пока результат не пустой, а *source больше, чем *result ». В настоящее время я реализую это сам, чтобы проверить это.
Показать ещё 4 комментария
3

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

  • 0
    +1 Это имеет то преимущество, что не требует никакой другой информации о состоянии - вы можете определить следующий ход, просто посмотрев на три стека.
  • 0
    +1 для простоты
Показать ещё 1 комментарий
1

Я бы сделал сортировку вставки. Стек 1 - это оригинальные, несортированные числа, стек 2 находится в порядке возрастания (последний вставленный элемент является самым большим), стек 3 находится в порядке убывания, а наименьший элемент в стеке 3 (который сверху) больше, чем самый большой элемент в стеке 2 (который также находится сверху).

Этот метод, как @AMADANONinc., Не требует памяти состояний или других переменных, и я думаю, что это быстрее.

Вызовите верхние элементы 1, 2 и 3 "A", "B" и "C" соответственно.

EDIT: Я переписал алгоритм, и я думаю, что он теперь строгий. Попробуйте эти правила в порядке, и когда вы перемещаете элемент, вернитесь к началу.

  1. Если стек 1 и стек 3 пусты, то мы закончили.
  2. Если стек 1 пуст (но 3 нет), переместите C в стек 2.
  3. Если B больше A, переместите B в стек 3.
  4. Если C меньше A, переместите C в стек 2.
  5. (Поскольку ни одно из предыдущих правил не применяется) переместите A в стек 2 или стоп 3.

Например, предположим, что стек 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 остановитесь.

  • 0
    В вашем первом утверждении я по сути перемещаю верхний элемент в стек 2 или 3, а затем следующий элемент в другой непустой стек, правильно? Я пытаюсь смоделировать это на доске, чтобы убедиться, что я правильно понимаю.
  • 0
    @TaiM .: переместить первый элемент в стек 2 или 3; скажем 2. Затем сравните A и B; если B больше, чем (согласно второму правилу), переместите его в стек 3, а если A больше, то переместите его в стек 3. Я вижу, что мое первое правило неполное - позвольте мне посмотреть, могу ли я его исправить. ..
Показать ещё 1 комментарий
0

Самый быстрый метод для сортировки 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, если количество элементов не является числом Фибоначчи), затем определяют, является ли первое слияние восходящим или нисходящим (после этого они чередуются) и отслеживание изменений размера выполнения. Если кто-то заинтересован, я могу опубликовать пример кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню