Это домашняя работа? Если нет, используйте std::stable_partition()
:
struct IsEven {
template<class T>
bool operator()(const T& v) const { return v % 2 == 0; }
};
int* arr = {1,2,3,4,5,6,7,8};
int* mid = std::stable_partition(arr, arr+8, IsEven());
Если это домашнее задание, то ваш инструктор, вероятно, ожидает от вас написания алгоритма. Если вам не нужно поддерживать порядок, как во входной последовательности, то вы можете сделать это довольно эффективно:
- Найдите первый элемент, который не удовлетворяет предикату (то есть нечетный ).
- Найдите, что последний элемент, который выполняет , удовлетворяет предикату (то есть даже )
- поменяйте местами два элемента.
- Повторите, начиная с позиций, которые вы только что нашли, пока эти две позиции не встретятся.
- Точка, в которой встречаются две позиции, - это середина раздела, где начинаются четные числа и начинаются нечетные числа.
Это примерно как std::partition()
работает. Если вам нужно поддерживать относительный порядок во входном массиве, вы все равно можете сделать это на месте, но это будет быстрее, если вы используете временный буфер. Скопируйте элементы, которые не соответствуют предикату, в этот буфер и сожмите на место те, которые делают. Наконец, верните элементы, которые не совпадают, в конце массива по порядку.