09.12.35 Uppbygging tölva

Forritunarverkefni 3


Í þessu verkefni eigið þið að skrifa skiptingarfall (partition) fyrir Quicksort röðunaraðferðina í IA-32 smalamáli inni í (inline) Visual C++.

Mesti tíminn í Quicksort fer í að skipta stökunum um vendistak. Það er því mikilvægt að sá hluti sé hraðvirkur til að aðferðin í heild sé hraðvirk. Hér að neðan er útfærsla á Quicksort í C++.

	void quicksort( int *a, int l, int r)
	{
	    if (r <= l) return;
	    int i = partition(a, l, r);
	    quicksort(a, l, i-1);
	    quicksort(a, i+1, r);
	}
Það eru til ýmsar útgáfur af skiptingarfallinu, en við munum nota aðferð sem skiptir um aftasta stakið (þ.e. stakið lengst til hægri).
	int partition(int *a, int l, int r)
	{
	    int i = l-1, j = r;
	    int v = a[r];
	    for (;;) { 
	        while (a[++i] < v) ;
	        while (v < a[--j]) if (j == l) break;
	        if (i >= j) break;
	        exch(a[i], a[j]);
	      }
	    exch(a[i], a[r]);
	    return i;
	}
Fallið exch víxlar á gildum í tveimur minnishólfum. Þið þurfið ekki að hafa það sem sérstakt fall.

Þið eigið að skrifa partition-fallið í IA-32 smalamáli, þannig að allur kódi þar sé í smalamáli. Það eina sem á að vera í C++ eru hausinn og breytuskilgreiningar. Skrifið líka aðalforrit sem kallar á Quicksort stefið með 100.000 staka slembivektor. Búið til slembitölurnar með "rand()*32768 + rand()".


Skilið útprentun í hólf í VR-II og keyrsluskrá sem viðhengi í tölvupósti til Páls föstudaginn 2. nóvember.

hh (hja) hi.is, 24. október, 2001.