Sortowanie tablicy według wartości – zwrócenie tablicy indeksów

0

`Witam,
staram się posortować tablicę N elementowa według wartości, lecz na wyjściu chcę mieć tablicą która zawiera indeksy tylko indeksy posortowanej tablicy np:

R [32 41 12 54 31] - tablica do posortowania
X [3 5 1 2 4] - wynikowa tablica zawierająca indeksy tablicy R

Ogólnie to ładnie się sortuje ale pomija 3 wartości nie wiedzieć czemu, może ktoś z Was się dopatrzy błedu, bądź innego rozwiązania.

 for(int i=0;i<100;i++)
    {
        X[i]=0;
    }
    int bufR,sprawdz=0;
    for(int j=0;j<N;j++)                //szukanie najmniejszego R i wpisywanie jego id do tablicy X
    {
        bufR=0;                         //ustawianie na pierwsze miejsce tablicy R
        for(int i=0;i<N;i++)            //szukanie najmniejszego R
        {
            if(R[i]<R[bufR])            //sprawdz czy kolejny jest mniejszy od dotychczas najmniejszego
            {
                for(int k=0;k<N;k++)    //sprawdzanie czy w tablicy X był już użyty ten R
                {
                    if(X[k]==i+1)
                    {
                    sprawdz=1;          //jesli byl ustawia zmienna pomocnicza na 1
                    }
                }
                if(sprawdz!=1)          //jesli nie byl to ten element jest najmniejszy
                {
                    bufR=i;
                }
            }
            sprawdz=0;                 //zeruje zmnienna sprawdzajaca
        }
        X[j]=bufR+1;                      //przypisuje w kolejne miejsca w tablicy id zmiennej R
    }
    for(int i=0;i<N;i++)
    {
        cout<<X[i]<<endl;
    }
0

Zadeklaruj drugą tablicę – czyli X – wypełnij ją liczbami od 1 do N po kolei. Podczas sortowania zamieniaj miejscami komórki w obu tablicach. Na koniec będziesz miał ładnie wymieszaną tablcę X, zgodnie z tym co znajduje się w R.

PS: Dlaczego chcesz mieć indeksy od 1, skoro komórki macierzy indeksowane są od 0?

0

Dobry pomysł, łatwiejszy w implementacji, będzie można także zastosować algorytm sortowania, dzięki.
Jeśli chodzi o indeksy tablicy X to takie jest założenie.

0

W inny sposób i tak tego nie zrobisz. Nie dasz rady uzyskać macierzy wyjściowej z indeksami, jeśli tych indeksów nigdzie nie będzie. A nawet jeśli, to jest to gra nie warta świeczki.

W tak prostym programie spokojnie możesz zadeklarować dodatkową macierz i użyć dowolnego algorytmu sortującego, pamiętając, aby podczas swapu modyfikować dane w obu macierzach.

0

Korzystając z dobrodziejstw C++11:

int main( int argc, char** argv )
{
std::vector< int > values{ 32, 41, 12, 54, 31 };
   std::vector< int > indexes( values.size() );
   std::iota( indexes.begin(), indexes.end(), 1 );
   std::sort( indexes.begin(), indexes.end(),
      [&values](int first, int second)
      {
      if (values[first - 1] < values[second - 1]) {
         std::swap( values.begin() + first - 1, values.begin() + second - 1 );
         return true;
       }
      return false;
      }
   );

   for (const auto& item : indexes)
   {
      std::cout << "Values[" << item << "]: " << values[ item - 1 ] << "\n";
   }
  return 0;
}
0

zrobione tak jak napisał furious programming, kopiuje tablice R, X wypelniam kolejnymi wartościmi, w algorytmie sortowania sortuje kopie R i zamieniam w X tak jak w R i mam, minuta roboty.

0

a co do mojego poprzedniego sposobu to pisane to było na szybko, działał ale nie do końca dobrze, gubił gdzieś trzy wartości nie ważne czy tablica miala 10 czy 100 wartości. Więc bez zamieniania w dwóch tablicach jest możliwość zrobienia tego, bo "i" jest indeksem tablicy i do X daje wartość"i", tylko że to dużo bardziej skomplikowane i nie tak wydajne jak posortowanie algorytmem.

0

TIP : Pomyśl może o jakimś algorytmie sortowania o małej złożoności.

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