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

Sortowanie pozycyjne (Radix sort)

Ostatnio zmodyfikowano 2014-08-19 23:24
Autor Wiadomość
shimizu
Temat założony przez niniejszego użytkownika
Sortowanie pozycyjne (Radix sort)
» 2014-08-19 17:14:12
Napisałem algorytm sortowania pozycyjnego ale nie jestem pewny czy można go tak nazwać. Algorytm dział bez zarzutu (sortuje jak należy).


C/C++
void radix_sort( int * T, int n ) { //T - tablica, n - rozmiar tablicy
    int x; //liczba wg której sortuje
    int d = 10; //dzielnik
    queue < int > * tmp = new queue < int >[ 10 ];
   
    while( 1 ) {
        for( int i = 0; i < n; i++ ) {
            x = T[ i ] % d;
            x = x /( d / 10 ); //wyznaczam odpowiednia cyfre z liczby
            tmp[ x ].push( T[ i ] );
        }
        if( tmp[ 0 ].size() == n ) break;
       
        int j = 0;
        for( int i = 0; i < 10; i++ ) {
            while( !( tmp[ i ].empty() ) ) { //przepisuje z kolejek wartosci do tablicy wyjsciowej
                T[ j ] = tmp[ i ].front();
                tmp[ i ].pop();
                j++;
            }
        }
        d = d * 10;
    }
}

Przy okazji cieszył bym się jakby ktoś mi doradził czy można to uprościć bo na wrzesień jeszcze duzo nauki. Najbardziej martwią mnie te kolejki bo jakoś mało optymalnie to wygląda ale tak gdzies usłyszałem i tak to napisałem.
P-115740
Monika90
» 2014-08-19 17:59:09
new nie jest tu potrzebne, tym bardziej, że dzięki niemu masz wyciek pamieci

Algorytm dział bez zarzutu (sortuje jak należy)
takiej tablicy
int a[5] = {40, 20, 10, 50, 30};
nie posortuje...
P-115744
shimizu
Temat założony przez niniejszego użytkownika
» 2014-08-19 19:31:24
Faktycznie :( No to musze pomyśleć jak ograniczyc tą pętle while... A z tym new to dokładniej co jest nie tak? Wiem że dużo pamięci zajmie ale tak słyszałem że jest to łatwo napisać. W sumie to chce to napisać jak najprościej nie patrząc na pamięc.
P-115749
Monika90
» 2014-08-19 19:46:59
wystarczy zwykła tablica kolejek
C/C++
queue < int > tmp[ 10 ];
to jeszcze łatwiej napisać niż new i nie musisz martwić się o zwalnianie pamięci
P-115753
shimizu
Temat założony przez niniejszego użytkownika
» 2014-08-19 20:30:16
Czy to nie bd zajmować tyle samo pamięci?
A co do warunku dla while'a (tego z 1) to chyba bez znajomości największego elementu się nie obejdzie.

C/C++
void radix_sort( int * T, int n, int lenght ) { //T - tablica, n - rozmiar tablicy, lenght - ilosc cyfr najwiekszej liczby
    int x; //liczba wg której sortuje
    int d = 10; //dzielnik
    queue < int > tmp[ 10 ];
   
    while( lenght != 0 ) {
        for( int i = 0; i < n; i++ ) {
            x = T[ i ] % d;
            x = x /( d / 10 ); //wyznaczam odpowiednia cyfre z liczby
            tmp[ x ].push( T[ i ] );
        }
        int j = 0;
        for( int i = 0; i < 10; i++ ) {
            while( !( tmp[ i ].empty() ) ) { //przepisuje z kolejek wartosci do tablicy wyjsciowej
                T[ j ] = tmp[ i ].front();
                tmp[ i ].pop();
                j++;
            }
        }
        d = d * 10;
        lenght--;
    }
}
Teraz powino działać już dla wszystkiego oprócz ujemnych.
P-115761
pekfos
» 2014-08-19 21:07:40
Czy to nie bd zajmować tyle samo pamięci?
Prawdopodobnie nie. Nie ma żadnego sensu używać dynamicznej alokacji, gdy możesz sprawę załatwić zwykłą tablicą.
P-115774
shimizu
Temat założony przez niniejszego użytkownika
» 2014-08-19 23:24:41
Właśnie zauważyłem i dlatego to poprawiłem. A pytanko tak z ciekawości.
P-115787
« 1 »
  Strona 1 z 1