Strukture podataka i algoritmi |
7.4 Bin Sort |
Pretpostavimo
Na primer, ako zelimo da sortiramo 104 32-bitnih celih brojeva,
tada je m = 232, pa nam je potrebno 232 operacija
(i veoma velika memorija!).
Za n = 104:
Implementacija Bin Sort-a bi mogla da izgleda ovako:
#define EMPTY -1 /* Neka nekoriscena vrednost */
void bin_sort( int *a, int *bin, int n ) {
int i;
/* Pre-uslov: za 0<=i<n : 0 <= a[i] < M */
/* Oznaci sve kutije kao prazne */
for(i=0;i<M;i++) bin[i] = EMPTY;
for(i=0;i<n;i++)
bin[ a[i] ] = a[i];
}
main() {
int a[N], bin[M]; /* za sve i: 0 <= a[i] < M */
.... /* Smesti objekte u niz a */
bin_sort( a, bin, N );
Ako postoje objekti sa istim kljucevima, tada se svaka kutija moze zameniti sa povezanom listom. Treci korak tada postaje:
Za razliku od drugih metoda za sortiranje, koji sortiraju u mestu i zahtevaju dodatnu memoriju, Bin Sort zahteva dodatnu memoriju za kutije i dobar je primer trampe prostora zbog performansi.
tako da bi memoriju mogli da koristimo veoma raskalasno da bi dobili na performansama, memorija trosi energiju i u nekim slucajevima, npr. racunara u kosmickim letelicama, energija bi mogla da bude vaznija stavka od performansi. |
Posto smo naglasili ovo ogranicenje,
pokazimo verziju Bin Sort-a koja sortira u mestu:
#define EMPTY -1 /* Neka nekoriscena vrednost */
void bin_sort( int *a, int n ) {
int i;
/* Pre-uslov: for 0<=i<n : 0 <= a[i] < n */
for(i=0;i<n;i++)
if ( a[i] != i )
SWAP( a[i], a[a[i]] );
}
Medjutim, ovde se pretpostavlja da postoji n
razlicitih kljuceva u opsegu 0 .. n-1.
Pored ovog ogranicenja, operacija zamene (swap) je relativno skupa,
tako da ova verzija dobija na prostoru u zamenu za duze vreme izvrsavanja.
Strategija Bin Sort-a mozda izgleda prilicno ogranicena, ali se moze uopstiti u strategiju poznatu kao Radix sortiranje.
Animacija Bin Sort-a Ovu animaciju je napisao Woi Ang. |
|
Posaljite komentare na adresu morris@ee.uwa.edu.au |
Dalje na Radix sortiranje Nazad na Sadrzaj |