Algoritmer og datastrukturer
Programmeringsprosjekt: Sortering med heap
Merk: Dette er ikke en obligatorisk oppgave, men en øvingsoppgave som du ikke skal levere inn.
I denne oppgaven skal du bruke en binær heap til å sortere data. Vi skal begrense oss til å se på sortering av arrayer/tabeller med heltall.
Vi vet at heapen er "lynrask" med hensyn til innsetting og fjerning av data. En heap har alltid O(log n) effektivitet, der n er antallet verdier som er lagret i heapen.
Dette kan vi utnytte til å lage en effektiv sorteringsalgoritme, fordi en min-heap alltid vil "levere tilbake" dataene vi putter inn i den i sortert rekkefølge: Hver gang vi fjerner en verdi fra heapen er det alltid den minste verdien som tas ut.
Følgende algoritme vil sortere en array med data med bruk av en heap:
-
Sett alle de n elementene i arrayen inn i en heap som initielt er tom.
-
Ta ut minste element av heap'en n ganger og
sett dem tilbake i arrayen i sortert rekkefølge.
Merk at denne algoritmen vil bruke en ekstra array til å lagre heapen. Den vil altså kreve like mye ekstra minne som dataene som skal sorteres. Det finnes smartere måter å gjøre heapsort på som er "in-house", dvs. at sorteringen gjøres "inne i" den opprinnelige arayen uten å kreve ekstra minne.
Oppgave 1
Programmer en metode:
void heapSort(int A);
som sorterer en array med heltall ved å bruke algoritmen med to steg som er gitt ovenfor. For å lagre tallene i A i en heap, skal du bruke implementasjonen av heap med heltall som er gitt i læringsmodulen i Canvas:
IntHeap.java→
For å bruke denne koden kan du bare laste den ned til samme katalog som du bruker for metoden heapSort().
Oppgave 2
Lag også et testprogram som gjør følgende:
-
Leser antall tall som skal sorteres, n, fra bruker.
-
Oppretter en array av lengde n og fyller denne med tilfeldige tall som er større eller lik 0 og mindre enn 2·n.
-
Sorterer arrayen med metoden du laget i oppgave 1.
-
Tar tiden på sorteringen og skriver ut antall millisekunder som det tok å sortere tallene.
Oppgave 3
Hva er arbeidsmengden, uttrykt med O-notasjon, til metoden du laget i oppgave 1?
|