2017-02-18 8 views
1

http://www.geeksforgeeks.org/segregate-even-and-odd-numbers/ Я искал вопросы интервью и наткнулся на этот интересный вопрос. Алгоритм кажется достаточно простым, но мне было интересно, можно ли поддерживать порядок четных и нечетных чисел, сохраняя при этом временную сложность O (n) без использования дополнительного пространства.Сортировка Четные и Нечетные числа в массиве при сохранении порядка

Например

ввода: {12, 34, 45, 9, 8, 90, 3}

выход: {12, 34, 8, 90, 45, 9, 3}

Редактировать: Если это невозможно без дополнительного пространства, может ли он работать с целыми числами, только перестроенными на место? Как и в свопах, может произойти только в массиве

+2

Что вы имеете в виду * «без лишнего пространства» *. Даже код, на который вы ссылались, использует дополнительное пространство ('left' и' right'). Вы имеете в виду * "с использованием только O (1) пространства" *? – trincot

+0

Без использования каких-либо других массивов, сохраняя четные числа в одном массиве и нечетные в другом, тогда объединение их вызывает очень простой вопрос. – user2435044

+0

ОК, это означает использование только постоянного пространства. – trincot

ответ

2

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

Эта проблема может рассматриваться как стабильная не-сортировка на месте, где все четные элементы сопоставляются нулю, а все нечетные элементы сопоставляются друг с другом для сравнения, и, похоже, нет алгоритма, который бы соответствовал этим критериям (стабильный, время O(n), дополнительная память O(1)) (см., например, таблицу «Сравнение без сортировки» на https://en.wikipedia.org/wiki/Sorting_algorithm#Comparison_of_algorithms).

+0

Хм, тогда можно было бы поменять массив на месте, используя другие массивы в качестве буфера? – user2435044

+0

@ user2435044: Да, это становится тривиальным: вы просто копируете все выравнивания в начало вашего основного массива и (в одном и том же проходе) все шансы на начало вашего массива буферов. Затем вы скопируете все шансы обратно в основной массив, начиная с того места, где вы скопировали выравнивания. (Или это не считается как «swap [ping] массив на месте»? Я не совсем понимаю, что вы подразумеваете под этой фразой, поскольку использование других массивов, по-видимому, означает, что вы * не * место.) – ruakh

+0

О, извините, я имел в виду использование другого массива, чтобы сохранить позицию evens/odds, чтобы сохранить порядок. Я думал о том, чтобы сделать вариацию сортировки, чтобы достичь этого, но он немного запутан, пытаясь сохранить порядок. – user2435044