Etsitään moodit. Moodeja voi olla useampi.
luvut = [12,12,2,2,7,2,12,12,15,10] maara = 0 moodiMaara = 0 mooditLuku = [] #Moodeja voi olla useampi. #Järjestetään taulukko, jotta sitä olisi helpompi käsitellä. for x in (0..luvut.length-1) for y in (x+1..luvut.length-1) if (luvut[x] > luvut[y]) temp = luvut[x] luvut[x] = luvut[y] luvut[y] = temp end end end #Otetaan minimi ja maksimi. minimi = luvut[0] maksimi = luvut[luvut.length-1] #Lasketaan lukujen määrä. #Etsitään samalla moodi. for x in (minimi..maksimi) #Lasketaan luvun määrä. maara = 0 for y in (0..luvut.length-1) if (x == luvut[y]) maara += 1 end end if (maara > moodiMaara) moodiMaara = maara end end #Etsitään moodit. #Moodeja voi olla useampi. for x in (minimi..maksimi) #Lasketaan luvun määrä. maara = 0 for y in (0..luvut.length-1) if (x == luvut[y]) maara += 1 end end if (maara == moodiMaara) mooditLuku.append(x) end end #Näytetään tulos. puts "Moodit:" for x in (0..mooditLuku.length) puts mooditLuku[x] end
Miksi käytät järjestämiseen omaa vaihtolajittelua? Lajittelun voi koodata itse harjoituksena kerran, mutta sitten kannattaa selvittää, mistä sen saa valmiina. Yleensä standardikirjaston lajittelu on myös nopeampi kuin vaihtolajittelu. Esimerkiksi Rubyssa listalla on suoraan sort-metodi.
Lisäksi kannattaisi oikeasti miettiä järkeviä ja toimivia algoritmeja. Nyt käyt läpi kaikki kokonaisluvut pienimmän ja suurimman luvun väliltä. Kokeile, miten koodisi toimii, kun laitat taulukkoon luvut 1 ja 2**60. Ei toimi hyvin!
Oikeasti toimiva ratkaisu ongelmaan on Hash-rakenteen käyttö, johon voi suoraan laskea jokaisen luvun lukumäärän (myös ilman taulukon järjestämistä). Toinen vaihtoehto on käydä läpi järjestetty taulukko, pitää kirjaa nykyisen luvun määrästä ja tarvittaessa lisätä luku moodeihin tai tyhjentää mooditaulukko.
En jaksa Rubylla tehdä, mutta Python on aika lähellä.
def moodit_1(lista): määrät = dict() for i in lista: if i in määrät: määrät[i] += 1 else: määrät[i] = 1 maksimi = max(määrät.values()) return [i for i, n in määrät.items() if n == maksimi] def moodit_2(lista): moodit, maksimi, nykyinen = [], 0, None for i in sorted(lista): if i != nykyinen: nykyinen, määrä = i, 1 else: määrä += 1 if määrä > maksimi: moodit, maksimi = [i], määrä elif määrä == maksimi: moodit.append(i) return moodit
Tässä nimenomaisessa tapauksessa voisi käyttää Pythonissa myös suoraan Counter-luokkaa, joka laskee lukujen määrät ja jolta voi suoraan kysyä, mitä lukua on eniten.
Aihe on jo aika vanha, joten et voi enää vastata siihen.