Zamiana wartości w tablicy zgodnie z warunkiem

0

Witam.
Czy może mi ktoś podpowiedzieć(ewentualnie dać fragment kodu do przeanalizowania) w jaki sposób jeżeli mam np. tablicę z wartościami: 1,2,3,4,5,6 ustawić (przy pomocy jednej pętli oraz bez użycia "tablic pomocniczych" ) tak by np. na początku były liczby parzyste a na końcu nieparzyste?
Dzięki.

5
std::vector<int> tab{1,2,3,4,5,6};
std::stable_partition(tab.begin(), tab.end(), [](int x){ return x%2 == 0;});

http://melpon.org/wandbox/permlink/YqAu9fJyI6WK8Jm6

std::stable_partition

Jest też std::partition, ale to nie zachowuje porządku wewnątrz grup (jeśli go nie potrzebujesz to użyj std::partition)

0

Dzięki ale jeszcze nie miałem takich rzeczy i niezbyt to ogarniam, nie da się tego jakoś zrobić "jak w kamieniu łupanym" pętlą? Mam już narzucone że sprawdzanie czy liczba jest parzysta mam w drugiej funkcji...tą funkcję przekazuje sobie do 2 funkcji która ma za zadanie tak poprzestawiać te elementy w tablicy(bez tablic pomocniczych) żeby po jej wykonaniu np. od prawej były same parzyste a od lewej same nieparzyste lub odwrotnie... siedzę nad tym i niezbyt mogę wymyślić ;/

2

Napisane tak prosto aż "zęby bolą" :-/ Zerknij na warunki. Da się jeszcze uprościć ale... już mi się nie chce :-/ W warunkach zadania nie było nic o zachowaniu kolejności więc.. jej nie zachowywałem ...

#include <iostream>

bool czy_parzysta(int wartosc) {
    return not (wartosc % 2);
}

typedef bool (*sprawdzenie_t)(int);

void przestaw_na_poczatek(int dane[], size_t ilosc, sprawdzenie_t sprawdz) {
    size_t ostatni = ilosc - 1;
    size_t pierwszy = 0;
    while(ostatni > pierwszy) {
        // przypadek gdzie 1 element spełnia sprawdz a 2 nie
        if(sprawdz(dane[pierwszy]) and not sprawdz(dane[ostatni])) {
            ++pierwszy;
            --ostatni;
        // przypadek gdzie 1 element i 2 spełania sprawdz
        } else if(sprawdz(dane[pierwszy]) and sprawdz(dane[ostatni])) {
            ++pierwszy;
        // przypadek gdzie 1 element nie spełnia sprawdz a drugi tak
        } else if(not sprawdz(dane[pierwszy]) and sprawdz(dane[ostatni])) {
            int pomocniczy = dane[ostatni];
            dane[ostatni] = dane[pierwszy];
            dane[pierwszy] = pomocniczy;
            ++pierwszy;
            --ostatni;
        // przypadek gdy 1 i 2 element nie spełniają sprawdz
        } else if(not sprawdz(dane[pierwszy]) and not sprawdz(dane[ostatni])) {
            --ostatni;
        }
    }
}

int main() {
    int dane[] = { 10, 2, 3, 5, 4, 7, 4, 2, 1, 1, 8, 6};
    size_t dane_rozmiar = sizeof(dane) / sizeof(int);
    przestaw_na_poczatek(dane, dane_rozmiar, czy_parzysta);
    for(size_t i = 0; i < dane_rozmiar; ++i) {
        std::cout << i << ": " << dane[i] << std::endl;
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1