Sortowanie pozycyjne (Radix sort)
Ostatnio zmodyfikowano 2014-08-19 23:24
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). void radix_sort( int * T, int n ) { int x; int d = 10; queue < int > * tmp = new queue < int >[ 10 ]; while( 1 ) { for( int i = 0; i < n; i++ ) { x = T[ i ] % d; x = x /( d / 10 ); 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() ) ) { 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. |
|
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... |
|
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. |
|
Monika90 |
» 2014-08-19 19:46:59 wystarczy zwykła tablica kolejek to jeszcze łatwiej napisać niż new i nie musisz martwić się o zwalnianie pamięci |
|
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. void radix_sort( int * T, int n, int lenght ) { int x; int d = 10; queue < int > tmp[ 10 ]; while( lenght != 0 ) { for( int i = 0; i < n; i++ ) { x = T[ i ] % d; x = x /( d / 10 ); tmp[ x ].push( T[ i ] ); } int j = 0; for( int i = 0; i < 10; i++ ) { while( !( tmp[ i ].empty() ) ) { T[ j ] = tmp[ i ].front(); tmp[ i ].pop(); j++; } } d = d * 10; lenght--; } } Teraz powino działać już dla wszystkiego oprócz ujemnych. |
|
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ą. |
|
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. |
|
« 1 » |