Pitäis vääntää ohjelma, joka kysyy 20 kokonaislukua, järjestää ne taulukkoon suuruusjärjestykseen ja tulostaa ne. Ja pitäisi käyttää jtn bubble sort'ia.
Tällä hetkellä motivaatio ei riitä kysyisen ohjelman vääntöö ja miksi yleensä konetekniikanopiskelijat tälläistä taitoa edes tarvitsee? Olisin ikuisesti kiitollinen jos saisin hieman apuja.
Lukujen kysyminen ja tulostus hoituu for-silmukalla:
for (i = 0; i < 20; i++) { scanf("%i", &luvut[i]); }
for (i = 0; i < 20; i++) { printf("%i", luvut[i]); }
Näiden välissä luvut pitää enää järjestää. Tiedätkö, miten kuplalajittelu (bubble sort) toimii? Siinä n lukua sisältävä taulukko käydään läpi n kertaa ja joka kerralla tutkitaan, ovatko vierekkäiset luvut oikeassa järjestyksessä, ja jos eivät ole, ne vaihdetaan keskenään. Toteutukseen tarvitaan kaksi sisäkkäistä for-silmukkaa, ja lukujen vaihtoon keskenään tarvitaan apumuuttuja.
Eikä sitä apumuuttujaakaan välttämättä tarvitse lukujen vaihtamiseen keskenään, jos käyttää XOR-operaatiota:
int a = 17; int b = 25; a = a ^ b; b = a ^ b; a = a ^ b; // nyt a = 25, b = 17
Tai tiiviimmin:
a ^= b ^= a ^= b;
Wikipedia tosin sanoo, että "On modern (desktop) CPUs, the XOR technique is considerably slower than using a temporary variable to do swapping".
Ja tuollaisia juttuja ei välttämättä ole muutenkaan tarkoitus käyttää ohjelmoinnin alkeisharjoituksissa.
(Mutta saa niistä silti mielellään mainita, niin monentasoiset lukijat oppivat keskustelussa.)
Kuka sitä nyt nopeudesta puhui, kunhan totesin ettei siihen tarvitse apumuuttujaa. Ja välittääkö joku oikeasti nopeudesta jos on toteuttamassa bubblesortia? :)
Toisaalta jo ihan koodin siisteyden ja luettavuuden vuoksi tuo apumuuttuja taitaa olla yleensä parempi ratkaisu.
Sami kirjoitti:
Ja välittääkö joku oikeasti nopeudesta jos on toteuttamassa bubblesortia? :)
20 alkion järjestelyssä kuplalajittelu luultavasti voittaa esim. pikalajittelun.
Aihe on jo aika vanha, joten et voi enää vastata siihen.