2014-09-04 1 views
0

Я знал, что это странная идея, о которой я должен думать, я хочу знать, можно ли изменить механизм сортировки (я не хочу отменять порядок).Сортировочный механизм Обращение с Delphi

например, скажем, у меня есть случайный массив целых чисел, тогда я отсортировал массив с помощью метода quicksort, теперь я хочу вернуться и разбить массив и вернуть его обратно в это.

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

и если возможно, пожалуйста, подумайте о том, чтобы показать мне лучший способ сделать это с помощью Delphi XE.

Заранее спасибо.

+2

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

+0

Откажитесь от индексов вместо –

+0

MartynA, Дэвид, спасибо за информацию, на самом деле размер имеет значение, поэтому я не хочу дублировать или сохранять указатели, я снова искал и нашел этот другой вопрос, его почти ту же идею, [алгоритм реверсивного сортировки] (https://stackoverflow.com/questions/12227599/reversible-sort-algorithm?rq=1), см. ответ о перестановке Сортировка, с этой ссылкой [Перестановочная сортировка] (http: // rosettacode.org/wiki/Sorting_algorithms/Permutation_sort), если это действительно детерминировано, то это возможно, последняя ссылка имеет множество примеров для этого метода, но не их в pascal lang. – Radament

ответ

4

Невозможно отменить. Вы должны либо:

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

  2. создать отдельный массив, который содержит указатели/индексы для значений в исходном массиве, а затем отсортировать второй массив, используя значения, на которые он ссылается.

+0

спасибо Реми за ответ, не могли бы вы рассмотреть возможность взглянуть на комментарий, который я добавил там, возможно, есть реальный шанс сделать это. – Radament

2

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

Если массив целых чисел, индексы не помогут вам, поскольку один индекс (указатель) принимает ту же память, что и один элемент массива. Если вам не хватает ОЗУ, используйте файл для хранения и извлечения массива. Если вы используете более крупные структуры данных, вы можете создавать, сохранять и извлекать индексы по предложению Дэвида.

3

Обычно я использую функцию, которая задает массив, который возвращает массив отсортированных индексов.

Таким образом, вы всегда будете иметь исходные данные, и вы сможете получить доступ к данным в отсортированном способе, используя что-то вроде:

for jIndex in ASortedIndexesArray do 
    ShowMessage(AOriginalArray[jIndex]); 

Надеется, что это помогает.

Мирко

+0

+1 это прекрасно работает –

2

Вы можете войти в свапирования действий, быстрая сортировка (или любой другой алгоритм сортировки вы используете) делает в список, а затем идти вперед и назад в этом списке, чтобы отменить/повторить эти действия. Не просто реализовать, но выполнимо.

+0

Это правильная идея, и на самом деле все очень просто. Просто создайте запись с двумя целыми числами и общим стеком, которые используют этот тип записи. Внедрите quicksort как обычно. Добавьте одну дополнительную строку кода, чтобы вставить индексы смененных элементов в стек. Теперь вы можете откидываться назад, просто выталкивая элементы из стека и меняя операцию. Это займет больше или меньше места, чем просто сохранение исходного массива, в зависимости от того, как он был отсортирован в первую очередь. – alcalde

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