Конечно, вы можете сделать это за O(n)
время, используя O(n)
дополнительной памяти.Вам нужна стабильная сортировка, и, по сути, вам необходимо выполнить первый шаг радикальной сортировки MSD (обычно знаковый бит является «наиболее значимым» битом, тогда как вас интересует четность / нечетность, но это та же самая базовая сделка),Радикальная сортировка может быть сделана стабильной с помощью отдельного буфера, содержащего либо значения 1, либо 0, а затем объедините их.
C ++ имеет алгоритм stable_partition
, который делает именно то, что вы хотите.Он имеет O(n)
сложность, если использует буфер, и O(n log n)
, если нет.Я не знаю технику для последнего.Я понимаю, что вопрос касается C, но вы можете скопировать и изменить код из любой стандартной реализации библиотеки C ++ или, возможно, использовать компилятор C ++, чтобы создать себе "extern C"
функцию, которая вызывает stable_partition
.