7. labor: sorteerimine

Labori materjal

Esitamisele kuuluvad ülesanded

Selles tunnis on üks tunnitöö millele on välja pakutud kaks lisaülesannet.

Tunnitöö: Mullsorteerimine

Tunnitöö raames sorteerid kasutaja poolt sisestatud arvujada kasutades mullsorteerimise algoritmi.

Nõuded
  • Kasutajalt küsitakse 5 täisarvu, mis salvestatakse massiivi.
  • Sorteeri massiiv kasutades mullsorteerimise algoritmi.
  • Optimeeri tsüklite kestvust sedasi, et asjatult võrdlusi ei sooritataks – just nii nagu oli slaidil näidatud. Veendu, et kirjutad optimeeringu nii sisemisse kui välimisse tsüklisse!
  • Loenda ja kuva mitu korda arve võrreldi omavahel. Kui tegid optimeerimise korrektselt, peaksid saama täpselt 10 võrdlust.
  • Kuva massiiv kasvavas järjekorras.
  • Kuva massiiv kahanevas järjekorras.
  • Sorteerida tohid kogu programmi vältel massiivi vaid ühel korral! Teises suunas massiivi kuvamiseks uuesti seda sorteerida ei tohi!
  • Luua tuleb neli funktsiooni. Loetelu nõutud funktsioonidest on loetletud allpool.
  • Meeldetuletuseks!
    • Muutujad lowerCamelCase
    • Funktsioonid UpperCamelCase
    • Makrod SCREAMING_SNAKE_CASE
    • Maagilised numbrid koodist asendatud makrotega
    • Massiivi pikkus antakse funktsiooni alati kaasa

Vasta küsimusele: jälgida saab nii võrdluste kui vahetuste arvu. Kumb neist meie optimeeringu tulemusel väheneb, kumb jääb samaks?

Lahenduses nõutavad funktsioonid

Selles programmis tuleb sul kokku luua 4 funktsiooni

  • Numbrite lugemiseks massiivi
  • Massiivi sorteerimiseks
  • Kaks funktsiooni massiivi kuvamiseks
Vihjed
  • Sa saad juba alustada eelmisel nädalal kirjutatud funktsioo! Eelmise nädala tunnitöödest on sul mõned funktsioonid juba olemas. Kopeeri sisse ja vajadusel modifitseeri neid, lisa juurde mis puudu.
  • Mullsorteerimise funktsioon on järjekordne funktsioon mille peaksid oma varasalve panema. Kui funktsiooni endale talletad, võta sealt vahetuste loendamine ära – mida vähem kõrvalmõjusid funktsioonidel on seda parem.
Test 1: Tagurpidine järjestus

Tegu on kõige keerulisema juhuga mullsorteerimiseks. Suurim on esimene, vähim viimane.

Test 2: Juhuslik massiiv

Juhuslik järjekord. Võrdluste arv jääb samaks. Testib ka kitsaid piirjuhte osadel arvutisüsteemidel kui massiivi piirest üle minnakse. Tegu ei ole põhjaliku ja tõendusliku testiga (selleks on spetsiaalsed tööriistad) aga võib mõnel juhul vea nähtavaks tuua.

Lisaülesanne 1: tsüklite täiendav optimeerimine

Algselt kirjeldatud algoritmi üks puudustest on olukord kui massiiv saab oluliselt varem sorteeritud kui algoritmi täielik tööaeg ette näeb. Sellist olukorda on võimalik tuvastada ning ära kasutada.

  • Kui massiiv saab sorteerituks enne viimast välimise tsükli läbikäiku, peata sorteerimine. Väldi tühja töö tegemist
  • Vihjeks: mõtle millised tegevused tehakse sorteerimise käigus ning mida ei tehta arvude puhul mis on juba sorteeritud.
  • Kaitsmisel: Selgita milliste sisendandmete puhul optimeeritud algoritm parema tulemuse annab ning tõesta seda oma tulemusega.

Lisaülesanne 2: Maatriksi sorteerimine

Selles ülesandes hüppad veidike teemades ette ning pead omapäi tutvuma 2-dimensioonilise massiivi ehk maatriksiga.

  • Lahenda ülesanne eraldi programmina, kasutades varasemalt tehtud põhjana. Jäta algne lahendus alles! Varem tehtud funktsioonid kuluvad tulevikus ära!
  • Antud lisaülesande võid lahendada funktsioonideta kuna me pole veel maatriksi edastamisest funktsioonidesse rääkinud.
  • Massiivi asemel tuleb sorteerida 5 x 5 maatriks
  • Sorteerimine toimub rida-rea haaval.
  • Maatriks peab olema algväärtustatud. Kasuta järgnevat maatriksit testimiseks
  • Näite maatriksi väljatrükist ja tsüklitest leiad siit: https://blue.pri.ee/ttu/programmeerimine-i/koodinaited/muutujate-algvaartustamine/
Oodatav tulemus
Vihjeid
  • Soovid oma juba loodud mullsorteerimise funktsiooni ära kasutada? C keeles on võimalik edastada funktsiooni maatriks “rea-kaupa” (tegelikkus on veidi keerulisem aga täidab meie eesmärki. Selleks kutsu funktsioon nii:
    SortArray(numbers[rowIndex], rowLength); Sedasi näeb su kood oluliselt ilusam välja.

Pärast tundi peaksid oskama järgmist

  • Peaksid saama aru mis asi arvu alus on
  • Peaksid teadma enimlevinuid arvusüsteeme, muuhulgas kahend- ja 16ndsüsteemi.
  • Peaksid aru saama mis vahe on positsioonilisel ja mittepositsioonilisel arvusüsteemil.
  • Peaksid aru saama mis asi on bitt ja bait ning mitu bitti on baidis.
  • Peaksid oskama teisendusi arvusüsteemides (10 -> 2, 10 -> 16, 10 -> 8, 2 > 10, 2 -> 16, 16 -> 10, 16 -> 2, 8 -> 10)
  • Peaksid aru saama mis asi on täisarvu ületäitumine
  • Peaksid mõistma, et sorteerimiseks on väga suur hulk algoritme ning õige algoritmi valimine on olulise tähtsusega reaalsetes rakendustes.
  • Peaksid mõistma, et optimeerimisel ja võimsamal riistvaral on oma koht, kuid parem algoritm või lähenemine annab suurema võidu.
  • Peaksid aru saama kuidas mullsort töötab ning oskama seda oma rakendustes kasutada.

Täiendav materjal

Üldised viited

Täisarvude ületäitumine reaalses elus