поддерживают два указателя: p1, p2.p1 переходит от начала к концу, p2 переходит от конца к началу и заменяет несоответствующие элементы.
псевдокод:
specialSort(array):
p1 <- array.start()
p2 <- array.end()
while (p1 != p2):
if (*p1 %2 == 0):
p1 <- p1 + 1;
continue;
if (*p2 %2 == 1):
p2 <- p2 -1;
continue;
//when here, both p1 and p2 need a swap
swap(p1,p2);
Обратите внимание, что сложность равна O(n)
, по крайней мере один изp1 или p2 изменяется в каждой второй итерации, поэтому цикл не может повторяться больше 2*n=O(n)
раз.[мы можем найти лучшую границу, но это не нужно].сложность пространства тривиальна O(1)
, мы выделяем постоянный объем пространства: только 2 указателя.
Примечание2: если ваш язык не поддерживает указатели [т.е. java, ml, ...], его можно заменитьс индексами: i1 идет от начала до конца, i2 идет от конца к началу, с тем же принципом алгоритма.