Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Merge sort
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
marija
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 27. 10. 2002. (19:13:55)
Postovi: (A)16
Sarma = la pohva - posuda
= 0 - 0

PostPostano: 16:54 uto, 10. 2. 2004    Naslov: Merge sort Citirajte i odgovorite

Može li neka dobra duša napisati algoritam za sortiranje niza pomoću merge sorta please! :D
Može li neka dobra duša napisati algoritam za sortiranje niza pomoću merge sorta please! Very Happy


[Vrh]
Korisnički profil Pošaljite privatnu poruku
ahri
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 19. 11. 2003. (23:16:07)
Postovi: (193)16
Sarma = la pohva - posuda
= 7 - 0

PostPostano: 19:34 uto, 10. 2. 2004    Naslov: Citirajte i odgovorite

moze.
dakle, algoritam:

funkcija mergesort:
"ako u nizu imas vise od jednog elementa, podijeli ga na 2 dijela i sortiraj svaki posebno, te ih onda spoji funkcijom merge"
funkcija merge (od 2 niza):
"stavi i=0, j=0. pogledaj je li a[i] manji od b[j]. ako je, strpaj u novi niz a[i] te povecaj i za jedan. ako nije, strpaj b[j] i povecaj j za 1. to radi sve dok jedan od nizova ne bude prazan, i onda strpaj ostatak drugog niza u novi niz".


sad malo objasnjenja.

dakle, ako imas jedan element, on je ocito sortiran.
a ako ih imas vise... onda ces sortirani niz dobiti tako da spojis dvije sortirane polovice u jedan (sortirani) niz.
te dvije sortirane polovice ces dobiti tako da svaki od nizova sortiras... naravno, rekurzivnim pozivom funkcije :).

merge bi trebao biti jasan.
evo neki primjer.

58 17 34 92 23 5 88 69


1) dakle, prvo se pozove merge za cijeli niz.
elemenata ima vise od 1, dakle podijelis popola.
2a) krenemo u ljevu polovicu
58 17 34 92

ponovo ima elemenata vise od 1, podijelimo popola

3a) 58 17

ponovo ima vise od 1, podijelimo popola

4a) 58
tu je sad 1, on je sortiran.
4b) druga polovica je 17.
ona je isto sortirana
sad ih "spojimo".
dobijemo 17 58.

sad druga polovica od 3 koraka
3b) 34 92
4c) 34
4d) 92
spojimo, dobijemo 34 92
sad spojimo 3a i 3b
17 34 58 92

sad desna polovica drugog koraka
2b) 23 5 88 69
3c) 23 5
4e) 23
4f) 5
spojimo : 5 23
3d) 88 69
4g) 88
4h) 69
spojimo: 69 88
spojimo 3c) i 3d)
5 23 69 88

i sad spojimo 2a) i 2b)
5 17 23 34 58 69 88 92


i niz je sortiran :).

ako zelis, mozes dobiti i ovakav grafikon: :)

[b]58 17 34 92 23 5 88 69[/b]
[b]58 17 34 92[/b] 23 5 88 69
[b]58 17[/b] 34 92 23 5 88 69
[b]58[/b] 17 34 92 23 5 88 69
58 [b]17[/b] 34 92 23 5 88 69
[b]17 58[/b] 34 92 23 5 88 69
17 58[b]34 92 [/b]23 5 88 69
17 58[b] 34 [/b]92 23 5 88 69
17 58 34 [b]92[/b] 23 5 88 69
17 58[b] 34 92 [/b]23 5 88 69
17 58 34 92 23 5 88 69
[b]17 34 58 92[/b] 23 5 88 69

itd itd...
moze.
dakle, algoritam:

funkcija mergesort:
"ako u nizu imas vise od jednog elementa, podijeli ga na 2 dijela i sortiraj svaki posebno, te ih onda spoji funkcijom merge"
funkcija merge (od 2 niza):
"stavi i=0, j=0. pogledaj je li a[i] manji od b[j]. ako je, strpaj u novi niz a[i] te povecaj i za jedan. ako nije, strpaj b[j] i povecaj j za 1. to radi sve dok jedan od nizova ne bude prazan, i onda strpaj ostatak drugog niza u novi niz".


sad malo objasnjenja.

dakle, ako imas jedan element, on je ocito sortiran.
a ako ih imas vise... onda ces sortirani niz dobiti tako da spojis dvije sortirane polovice u jedan (sortirani) niz.
te dvije sortirane polovice ces dobiti tako da svaki od nizova sortiras... naravno, rekurzivnim pozivom funkcije :).

merge bi trebao biti jasan.
evo neki primjer.

58 17 34 92 23 5 88 69


1) dakle, prvo se pozove merge za cijeli niz.
elemenata ima vise od 1, dakle podijelis popola.
2a) krenemo u ljevu polovicu
58 17 34 92

ponovo ima elemenata vise od 1, podijelimo popola

3a) 58 17

ponovo ima vise od 1, podijelimo popola

4a) 58
tu je sad 1, on je sortiran.
4b) druga polovica je 17.
ona je isto sortirana
sad ih "spojimo".
dobijemo 17 58.

sad druga polovica od 3 koraka
3b) 34 92
4c) 34
4d) 92
spojimo, dobijemo 34 92
sad spojimo 3a i 3b
17 34 58 92

sad desna polovica drugog koraka
2b) 23 5 88 69
3c) 23 5
4e) 23
4f) 5
spojimo : 5 23
3d) 88 69
4g) 88
4h) 69
spojimo: 69 88
spojimo 3c) i 3d)
5 23 69 88

i sad spojimo 2a) i 2b)
5 17 23 34 58 69 88 92


i niz je sortiran :).

ako zelis, mozes dobiti i ovakav grafikon: :)

58 17 34 92 23 5 88 69
58 17 34 92 23 5 88 69
58 17 34 92 23 5 88 69
58 17 34 92 23 5 88 69
58 17 34 92 23 5 88 69
17 58 34 92 23 5 88 69
17 5834 92 23 5 88 69
17 58 34 92 23 5 88 69
17 58 34 92 23 5 88 69
17 58 34 92 23 5 88 69
17 58 34 92 23 5 88 69
17 34 58 92 23 5 88 69

itd itd...



_________________
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
ahri
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 19. 11. 2003. (23:16:07)
Postovi: (193)16
Sarma = la pohva - posuda
= 7 - 0

PostPostano: 19:38 uto, 10. 2. 2004    Naslov: kod... Citirajte i odgovorite

[code:1]
// ispis poruke i prekid programa
void Fatalno (char *niz) {
printf ("\n %s \n", niz);
exit (1);
}

// udruzivanje LPoz:LijeviKraj i DPoz:DesniKraj
void Merge (tip A [], tip PomPolje [], int LPoz, int DPoz, int DesniKraj) {
int i, LijeviKraj, BrojClanova, PomPoz;
LijeviKraj = DPoz - 1;
PomPoz = LPoz;
BrojClanova = DesniKraj - LPoz + 1;
// glavna pelja
while (LPoz <= LijeviKraj && DPoz <= DesniKraj) {
if (A [LPoz] <= A [DPoz])
PomPolje [PomPoz++] = A [LPoz++];
else
PomPolje [PomPoz++] = A [DPoz++];
}
while (LPoz <= LijeviKraj)
// Kopiraj ostatak prve polovice
PomPolje [PomPoz++] = A [LPoz++];
while (DPoz <= DesniKraj)
// Kopiraj ostatak druge polovice
PomPolje [PomPoz++] = A [DPoz++];
for (i = 0; i < BrojClanova; i++, DesniKraj--)
// Kopiraj PomPolje natrag
A [DesniKraj] = PomPolje [DesniKraj];
}
// MergeSort - rekurzivno sortiranje podpolja
void MSort (tip A [], tip PomPolje[], int lijevo, int desno ) {
int sredina;
if (lijevo < desno) {
sredina = (lijevo + desno) / 2;
MSort (A, PomPolje, lijevo, sredina);
MSort (A, PomPolje, sredina + 1, desno);
Merge (A, PomPolje, lijevo, sredina + 1, desno);
}
}
// MergeSort - sort udruzivanjem
void MergeSort (tip A [], int N) {
tip *PomPolje;
PomPolje = malloc (N * sizeof (tip));
if (PomPolje != NULL) {
MSort (A, PomPolje, 0, N - 1);
free (PomPolje);
} else
Fatalno ("Nema mjesta za PomPolje!");
}
[/code:1]
Kod:

// ispis poruke i prekid programa
void Fatalno (char *niz) {
  printf ("\n %s \n", niz);
   exit (1);
}

// udruzivanje LPoz:LijeviKraj i DPoz:DesniKraj
void Merge (tip A [], tip PomPolje [], int LPoz, int DPoz, int DesniKraj) {
  int i, LijeviKraj, BrojClanova, PomPoz;
  LijeviKraj = DPoz - 1;
  PomPoz = LPoz;
  BrojClanova = DesniKraj - LPoz + 1;
  // glavna pelja
  while (LPoz <= LijeviKraj && DPoz <= DesniKraj) {
    if (A [LPoz] <= A [DPoz])
      PomPolje [PomPoz++] = A [LPoz++];
    else
      PomPolje [PomPoz++] = A [DPoz++];
  }
  while (LPoz <= LijeviKraj)
    // Kopiraj ostatak prve polovice
    PomPolje [PomPoz++] = A [LPoz++];
  while (DPoz <= DesniKraj)
    // Kopiraj ostatak druge polovice
    PomPolje [PomPoz++] = A [DPoz++];
  for (i = 0; i < BrojClanova; i++, DesniKraj--)
    // Kopiraj PomPolje natrag
    A [DesniKraj] = PomPolje [DesniKraj];
}
// MergeSort - rekurzivno sortiranje podpolja
void MSort (tip A [], tip PomPolje[], int lijevo, int desno ) {
  int sredina;
  if (lijevo < desno) {
    sredina = (lijevo + desno) / 2;
    MSort (A, PomPolje, lijevo, sredina);
    MSort (A, PomPolje, sredina + 1, desno);
    Merge (A, PomPolje, lijevo, sredina + 1, desno);
  }
}
// MergeSort - sort udruzivanjem
void MergeSort (tip A [], int N) {
  tip *PomPolje;
  PomPolje = malloc (N * sizeof (tip));
  if (PomPolje != NULL) {
    MSort (A, PomPolje, 0, N - 1);
    free (PomPolje);
  } else
      Fatalno ("Nema mjesta za PomPolje!");
}



_________________
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
Gost






PostPostano: 15:30 sri, 11. 2. 2004    Naslov: Citirajte i odgovorite

Fala! Fala!
Fala! Fala!


[Vrh]
ahri
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 19. 11. 2003. (23:16:07)
Postovi: (193)16
Sarma = la pohva - posuda
= 7 - 0

PostPostano: 16:38 sri, 11. 2. 2004    Naslov: Citirajte i odgovorite

nema na cemu :)
nema na cemu :)



_________________
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan