Преобразовать одномерный массив состоящий из n вещественных элементов

преобразовать одномерный массив, состоящий из n вещественных элементов, таким образом, чтобы сначала располагались все элементы, равные 0, а потом — все остальные.

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

Или тупо отсортировать массив без учета знака чисел. Но это уже будет O( N log N ).

Для целых:

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>


int main()
{
    std::vector<int> vec{1, 7, 2, 6, 0, -7, 3, -1, 0, 4, 5};
    std::stable_partition(std::begin(vec), std::end(vec), [](auto x){return x == 0;});
    for (auto e: vec) {
        std::cout << e << " ";
    }
}

Для вещественных нужно немного переделать. Это я тебе оставлю. :)

MasterOfAlteran, STL — это круто, но...

ТС говорил о массиве. Это мелочь, конечно, но ТС может не втыкнУть.

stable_partition хочет дополнительной памяти. И сложность в худшем случае (last — first) * log(last — first), а при наличии доп. памяти — линейная. Поскольку в задаче не ставится условие сохранения порядка, то лучше будет partition: не нужно доп. памяти и сложность линейная.

Подозреваю, что алгоритм, который я описал, как раз и реализован в partition. Только без всяких шаблонов и итераторов ;)

Это мелочь, конечно, но ТС может не втыкнУть.

Чем смог, тем помог. ))))

то лучше будет partition

Я решил показать stable_partition.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.