Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Sortowanie tablicy struktur z wartościami ujemnymi

Ostatnio zmodyfikowano 2015-05-28 16:40
Autor Wiadomość
Guillermo
Temat założony przez niniejszego użytkownika
[C++] Sortowanie tablicy struktur z wartościami ujemnymi
» 2015-05-28 01:46:51
Witam!

Potrzebuję posortować tablicę struktur danych z wartościami ujemnymi. Używam do tego qsort, ale niestety wszystkie wartości ujemne (tab.znak < 0) wyrzuca mi na koniec.
Należy zmodyfikować jakoś to sortowanie, czy może jest jakieś inne? Nie do końca wiem jak wykorzystać "zwykłe" sortowania tablic do tych, które zawierają struktury.
Sortowanie ma się odbywać malejąco według ilości wystąpień (tab.ile) oraz rosnąco według znaku (tab.znak)
Jest to fragment programu do kompresji Hufmanna. Wartości ujemne to znaki poszczególnych węzłów.

C/C++
#include <iostream>
#include <cstdlib>
#include <string>
#include <fstream>
#include <algorithm>

using namespace std;

struct wczytaj {
    int znak;
    int ile;
};

struct drzewo {
    int ojciec;
    int lewy;
    int prawy;
};

int my_compare( const void * a, const void * b )
{
    int _a = *( int * ) a;
    int _b = *( int * ) b;
    if( _a < _b ) return - 1;
    else if( _a == _b ) return 0;
    else return 1;
   
}

int tree( string nazwa_pliku_wejsciowego ) {
    drzewo drz[ 256 ];
    wczytaj tab[ 256 ];
    for( int i = licz - 1; i > 0; i-- )
    {
        drz[ i ].ojciec = -( licz - i );
        drz[ i ].lewy = tab[ i ].znak;
        drz[ i ].prawy = tab[ i - 1 ].znak;
        plik_wyjsciowy << drz[ i ].ojciec << " " << drz[ i ].lewy << " " << drz[ i ].prawy << endl;
        tab[ i - 1 ].ile += tab[ i ].ile;
        tab[ i - 1 ].znak = drz[ i ].ojciec;
        tab[ i ].ile = 0;
        tab[ i ].znak = 0;
        qsort( tab, licz - i, sizeof( int ), my_compare );
    }
}
P-132870
stevy
» 2015-05-28 08:29:15
Drzewo binarne do którego dążysz wygląda nieco inaczej i węzły sortuje się też trochę inaczej.
A teraz do rzeczy:
W qsorcie jako bazowa tablica podałeś strukturę(int, int). Jako rozmiar elementu dałeś jednego int-a (sizeof int), powinieneś podać rozmiar struktury swojej i zmienić funkcję sortującą.

P-132874
Guillermo
Temat założony przez niniejszego użytkownika
» 2015-05-28 10:14:30
Właśnie w tym "trochę" inaczej jest cały pies pogrzebany.Zmieniłem do postaci:
qsort( tab, i, sizeof( struct wczytaj ), my_compare );


Wiem, że wykonuje sortowanie tylko według pierwszego parametru ze struktury (jak zmieniłem kolejność w struct wczytaj to sortuje mi według ilości). Wiem też jak zmienić z sortowania rosnącego na malejące. Ale jak wybrać, żeby sortował według drugiego parametru?

Chciałbym posortować niezależnie w kolejności:
1. rosnąco według znaków
2. malejąco według ilości wystąpień.
P-132876
Monika90
» 2015-05-28 10:18:43
A może po prostu użyj C++, wiesz, std::sort itp...
P-132877
stevy
» 2015-05-28 16:40:37
a może dlatego robi to według 1 parametru, bo...

C/C++
int my_compare( const void * a, const void * b )
{
    int _a = *( int * ) a; //jakie inty, skoro chcesz strukturę sortować?
    int _b = *( int * ) b; // to samo
    if( _a < _b ) return - 1;
    else if( _a == _b ) return 0;
    else return 1;
   
}

mówiłem żebyś compare też zmienił.
Twoje "a" w funkcji to nie int, tylko wczytaj...
P-132899
« 1 »
  Strona 1 z 1