Przesunięcie elementów tablicy w lewo i w prawo

0

Cześć!
Mam do napisania program, który ma przesunąć nieparzyste elementy tablicy na lewą stronę, a parzyste na prawą. Próbowałem czegoś takiego:

int tab [8]={1,2,3,4,5,6,7,8};
for(int i=0;i <=7; i++)
{
     if (tab[i]%2==0) swap(tab[i], tab[i+1]);
}

Ale nie działa to poprawnie i w sumie nie wiem, dlaczego. Pewnie jest to banalne do napisania, ale jestem początkujący i mnie to przerasta. Ktoś pomoże?

0

Po pierwsze algorytm jest nieprawidłowy, a po drugie jest wyjście poza zakres tablicy przy i == 7.

0

Skoro algorytm jest nieprawidłowy, to jak inaczej mogę się za to zabrać?

0

Czy na wyjsciu z [1, 2, 3, 4] ma byc [4, 3, 2, 1], czy [1, 3, 2, 4]? Czy jeszcze inaczej?

0

skoro i tak musisz przejsc po calej tablicy po kazdym elemencie to ja bym to zrobil tak (pseudokod)

int sizeOfArray = 8;
int newArray[sizeOfArray ]={};
for (int i = 0 ; i < sizeOfArray ; i += 2)
{
  if (i+1 >= sizeOfArray) continue; 
  newArray[i] = oldArray[i+1];
  newArray[i+1] = oldArray[i]
}
3

std::partition, std::stable_partition

int tab [8]={1,2,3,4,5,6,7,8};
partition(begin(tab), end(tab), [](int x){ return x % 2; });

https://wandbox.org/permlink/T0slH3pj8eyN47Fx

0

@lion137: Z {1,2,3,4} na wyjściu ma być {1,3,2,4}.

0

@fasadin: Nie mogę utworzyć nowej tablicy, muszę zmodyfikowaś istniejącą.

0

Podepnę się do tematu. Napisałem z czystej ciekawości funkcję partition opartą na wskaźnikach (na podstawie możliwej implementacji std::partition). Nie dałem predykatu, bo ma być tylko do tego przypdaku.

void partition(int* first, int* last)
{    
    while (*first % 2 && first != last) ++first;
    if (first == last) return;
    for (int* i = first + 1; i != last + 1; ++i) {
        if (*i % 2) {
            std::swap(*i, *first);
            ++first;
        }
    }
}
// ...
int tab[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
partition(tab, tab + 7);

Pytanie dotyczy porównania wskaźnika z adresem poza tablicą.
i != last + 1, gdzie last jest wskaźnikiem na ostatni element tablicy. Czy to jest UB, jeśli nie modyfikujemy i nie odczytujemy danych,
spod tego wskaźnika tylko porównujemy adres wskaźnika i z adresem poza tablicą?

1

Możesz użyć wskaźnika 1 za tablicą (nie mowa o dereferencji) w pełni legalnie.

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