[LUGOS-PROG] Mergesort iterativno
Andrej (Andy) Brodnik
Andrej.Brodnik at IMFM.Uni-Lj.SI
Thu Nov 6 05:57:40 CET 2003
On Wed, Nov 05, 2003 at 03:04:26PM +0100, Simon Striker wrote:
>
> Mi lahko kdo lepo prosim pomaga najti itertivno re9itev algoritma
> mergesort. Pripenjam prilogo, v kateri je moj program z rekurzivnim
> algoritmom, jaz pa moram program spremeniti tako, da bo algoritem
> iterativen.
>
> Za morebitno pomoh oziroma nasvet se vsam >e v naprej zahvaljujem.
To ni ne zlivanje ne pospeseno urejanje. V osnovi je:
mergsort(a, l, h):
if (l < h) then
mergesort(a, l, (l+h)/2)
mergesort(a, (l+h)/2+1, h)
merge(a, l, (l+h)/2, h) // srednji argument je lahko opuscen
v resnici res zlivanje. Pospeseno urejanje je pa:
quicksort(a, l, h):
if (l < h) then
m= choose(a, l, h) // izberi delilini argument
m= split(a, l, m, h) // polje a je razdeljeno tako, da
// a[i]<=a[j], l<i<m<j<h
quicksort(a, l, m-1)
quicksort(a, m+1, h)
Bistvena razlika je, da se rekurzivni del ,,deli in vladaj`` pri
zlivanju zgodi _pred_ zlivanjem in pri pospesenem urejanju _po_
razdeljevanju polja. To in kolicina zbrane informacije imata za
posledico, da en ureja v O(n logn) premikih in drugi v O(n^2)
premikih.
Kar zadeva iterativne resitve je tako, da potrebujemo dodatno
strukturo, ki hrani podprobleme, katere se moramo resiti. To je lahko
sklad, na katerega nalagamo probleme in jih sproti resujemo:
push(sklad, "mergesort(0, n)");
while (! empty(sklad))
problem= pop(sklad)
if (problem == "mergesort(l, h)")
if (l < h) then
push(sklad, "merge(l, (l+h)/2, h) ")
push(sklad, "mergesort((l+h)/2+1, h)")
push(sklad, "mergesort(l, (l+h)/2) ")
else
merge(a, l, m, h)
Malce se je se potreba poigrati z definicijo sklada, a za namig:
typedef struct {
bool isMerge;
union {
struct _isMerge { ... };
struct _isMergeSort { ... };
}
} itemOnStack;
Izziv: kako napisati podatkovno strukturo, ki si bi jo delilo vec
procesov in bi zlivanje napisali z vzporedno delujocimi procesi?
LPA
More information about the lugos-prog
mailing list