Kreu simplajn algoritmojn

Skip to content

Ĉi tio estas maŝine tradukita teksto kiu povas enhavi erarojn!

Quote

“Algoritmo”, vorto uzata de programistoj kiam ili ne volas klarigi kion ili faris.

Algoritme?

Kio estas algoritmo?

Algoritmo estas logika funkcio kiu plenumas donitan operacion. Do, vi povas teknike nomi funkcion kiu sumigas du nombrojn “algoritmon”, sed plej ofte algoritmo estas io iomete pli komplika ol tio. Ofte algoritmoj estas uzataj por fari operaciojn kiuj daŭras multe da tempo, pli rapide.

Algorithm Meme

Ĉu mi devas uzi Python en ĉi tiuj taskoj?

Ne! Vi povas uzi ajnan programlingvon, kiun vi preferas en ĉi tiuj taskoj.

Enigaj bibliotekoj?

La ideo en ĉi tiuj taskoj estas eviti uzi enigajn bibliotekojn aŭ specialajn Python-funkciojn. Ekzemple, ekzistas simpla “unu-linio” por renversi tekston: text[::-1], sed ĉi tie ni volas, ke vi provu solvi tiajn taskojn sen uzi tion. Ĝi eble okazas, ke ni mencionu enigitan funkcion se la solvo estas iomete malfacila por trovi. Tio estos markita per ❗.

Praktike, estus plene eble solvi ĉiujn ĉi tiujn taskojn per if, for, while kaj ordinaraj listoperacioj.

Kiel “dezajni” algoritmon?

Plej ofte algoritmoj estas desegnitaj iteracie. Kion tio signifas?

1. ✅ Unue disĵetu la problemon en pli malgrandajn partojn.
  • Unue pensu pri la plej grava afero, kiun vi bezonas por ke la algoritmo funkciu
    • Ĉu ĝi devas redoni valoron? Ĉu boolean-on? Ĉu liston?
    • Ĉu mi bezonas iujn helpajn funkciojn?

2. ❓ Ĉu ekzistas iuj “ekstremaj kazoj”?
  • Kio okazas se vi enmetas malplenan liston aŭ tekston?

3. ✅ Komencu per simple provi krei solvon

4. ✅ Kontrolu ĉu la algoritmo funkcias bone en la ekzekutotempo
  • Provu pli grandan eniron, ĉu ĝi daŭras longan tempon?

5. ❓ Konsideru vian solvon, ĉu vi bezonas ĉiujn paŝojn, kiujn vi uzis?
  • Ĉu ĉiuj if-kontrolaj estas necesaj?
  • Se vi havas pli ol unu for-ciklo, ĉu ekzistas klaraj manieroj fari tion al unu for-ciklo?
    • Tio estas malsama se vi havas nestigitajn ciklojn aŭ ciklojn post unu la alian. Post unu la alian ofte eblas eviti.

6. ✅ Konsideru ekstremajn scenarojn kun eniroj:
  • Ekzemplo kun nombroj: grandaj nombroj, malgrandaj nombroj, negativaj nombroj
  • Tekstekzemplo: multe da teksto, multaj malgrandaj vortoj, ekstra spacoj, grandaj kaj malgrandaj literoj.

7. ❓ Ĉu estas utile uzi pseŭdo-kodon por pli bone kompreni la logikon?

Easy Tasko 1 - Trovi ĉu listo enhavas donitan numeron

Kreu algoritmon (funkcion) kiu trovas ĉu listo enhavas donitan numeron. Ĝi devas returni TrueFalse bazite ĉu la nombro ekzistas en la listo aŭ ne.

Jen listo kun testaj datumoj:

Test-data for algoritme:
Test-Data Sjekk Svar
[1, 2, 3, 4, 5, 6, 7, 8, 9] 5 True
[1, 2, 3, 4, 5, 6, 7, 8, 9] 10 False
[2, 3, 5, 7, 11, 13, 17, 19, 23] 2 True
[2, 3, 5, 7, 11, 13, 17, 19, 23] 10 False
[-1, 0, 1, -34, 321, 22, 98, -214] -214 True
[-1, 0, 1, -34, 321, 22, 98, -214] 0 True
[-1, 0, 1, -34, 321, 22, 98, -214] 2 False

Tips til framgangsmåte
  1. Enigu liston kaj listan valoron en funkcion. En ĉi tiu tasko estos nombroj, sed povas esti teksto.
  2. Uzu for-ciklon por trairi la liston
  3. Se la nombro estas egala al la kontrola nombro, returnu True
  4. Se la for-ciklo finiĝis kaj vi ne trovis ĝin, returnu False

Svaret (i python)
def exists_in_list(the_list, check):
    for number in the_list:
        if number == check:
            return True
    return False


Easy Tasko 2 - Sumigado

Kreu algoritmon kiu sumigas liston de nombroj.

Test-data por algoritmo:
  • [1, 2, 3, 4, 5, 6], donas la respondon 21.
  • [5, 1, 23, 68, 22, 13, 4], donas la respondon 136
  • [3, 3, -3, -3, 3] donas la respondon 3. Eble vi povas ignori negativajn nombrojn kaj doni la respondon 9.

Tips til framgangsmåte
  1. Enigu liston en funkcion
  2. Konservu temporan sumon kiel 0.
  3. Uzu for-ciklon por trairi la liston.
  4. return la sumon de la listo.

Svaret (i python)
def sum_list(numbers):
    total = 0
    for num in numbers:
        total += num
    return total


Medium Tasko 3a - Maksimumo en Listo

Kreu algoritmon kiu trovas la plej grandan valoron en listo.

Test-data for algoritme:
  • [1, 2, 3, 4, 5, 6], donas la respondon 6.
  • [6, 17, 227, 1, 23, 42, 12], donas la respondon 227
  • [2, -2, 2, -2, -2, 2] donas la respondon 2.

Tips til framgangsmåte
  1. Enigu liston en funkcion
  2. Metu provizoran valoron al la unua elemento de la listo.
  3. Uzu for-ciklon por trairi la liston kaj komparu kun la valoro kiun vi metis en 2.
  4. Se la valoro estas pli granda, metu la provizoran valoron al la nova valoro.
  5. return ĉi tiun provizoran valoron.

Svaret (i python)
def find_max(numbers):
    largest = numbers[0]
    for num in numbers:
        if num > largest:
            largest = num

    return largest

Easy Tasko 3b - Se la listo estas malplena?

Aldonu kontrolon kiu testas ĉu la listo enhavas elementojn. Se ne, returnu None.

Svaret (i python)
def find_max(numbers):
    if len(numbers) == 0:
        return None

    largest = numbers[0]
    for num in numbers:
        if num > largest:
            largest = num

    return largest


Easy Tasko 4 - Nombri la nombron de donita elemento en listo

Kreu algoritmon kiu nombras la nombron de donita elemento en listo.

Test-data for algoritme:
  • ["apple", "banana", "orange", "apple", "apple", "banana"] kun apple donas la respondon 3.
  • [1, 4, 5, 2, 4, -3, -4, 4, 2, 4, 221, 3, 1, 1, 4, 1, 12, 33, 4, 4, 2, -4, 1, 4] kun 4 donas la respondon 8.
  • ["cat", "dog", "cat", "mouse", "cat", "dog", "dog"] kun dog donas la respondon 3.
  • [7, 7, 2, 9, 7, 1, 0, 7, 3, 7, 9] kun 7 donas la respondon 5.
  • ["red", "blue", "green", "red", "yellow", "red"] kun red donas la respondon 3.
  • [10, -2, -2, -2, 5, 10, 10, -2] kun -2 donas la respondon 4.

Tips til framgangsmåte
  1. Enigu liston kaj kontrolvaloron en funkcion
  2. Komencu per tempora nombrvaloro fiksita je 0.
  3. Trairu la liston per for-ciklo.
  4. Se la elemento estas egala al la kontrolo, pligrandigu la nombrvaloron je 1.
  5. Redonu la nombrvaloron.

Svaret (i python)
def count(the_list, check):
    count = 0
    for element in the_list:
        if element == check:
            count += 1

    return count


Medium Tasko 5 - Inverti string-on, tekston

Kreu algoritmon kiu inversigas donitan string-on.

Test-data for algoritme:
  • Hello there! fariĝas !ereht olleH.
  • heisann alle sammen fariĝas nemmas ella nnasieh
  • Python fariĝas nohtyP
  • racecar fariĝas racecar
  • 12345abc fariĝas cba54321
  • god morgen fariĝas negrom dog

Tips til framgangsmåte
  1. Enigu string-on en funkcion
  2. Kreu temporan valoron por konservi malplenan string-on.
  3. Trajru la tekstojn per for-ciklo kun range. Vi povas trairi la liston malantaŭen, sed eblas solvi tion per trairo antaŭen en la listo.
  4. Aldonu ĉiun karakteron al la tempora valoro laŭvice.
  5. Redonu la temporan tekston.

Svaret (i python)
def reverse(text):
    result = ""
    # Ĉi tiu linio estas iomete komplika, sed ĝi komenciĝas
    # ĉe la fino, iras (inkluzive) ĝis 0 (skribante
    # -1 kiel finon), kaj kalkulas malsupren je 1 ĉiu fojo
    for i in range(len(text) - 1, -1, -1):
        result += text[i]
    return result

Eble vi povas uzi algoritmon kiu aldonas al la komenco anstataŭe:

def reverse(text):
   result = ""
   for i in range(0, len(text)):
       # aldonu al la komenco anstataŭe
       result = text[i] + result
   return result


Medium Tasko 6 - Palindroma Algoritmo

Kreiu algoritmon kiu kontrolas ĉu donita vorto estas palindromo. Ekzemploj de palindromoj estas abba, racecar, regninger.

Tips til framgangsmåte
  1. Kreu funkcion kiu prenas tekston por kontroli
  2. Uzu for-buŝon por kontroli ĉu la literoj ĉe ĉiu flanko de la teksto estas egalaj.
  3. Redonu False se litero ne kongruas, se ĉiuj kongruas (for-buŝo finiĝas), redonu True.

Ekstra:
Ĉu vi vidas kiel vi povas fari la algoritmon duobla rapideco?

Hint

Vi nur bezonas kontroli duonon!

Svaret (i python)
def palindrome(text):
    for i in range(0, len(text)):
        if text[i] != text[len(text) - i - 1]:
            return False
    return True
Raskere algoritme

def palindrome(text):
for i in range(0, int(len(text) / 2)):
if text[i] != text[len(text) - i - 1]:
return False
return True


Medium Tasko 7 - Kontroli ĉu listo estas ordigita

Kreu algoritmon kiu kontrolas ĉu listo estas ordigita. La plej facila maniero kontroli tion estas komenci de la komenco kaj kompreni ĉu la sekva elemento estas “pli granda”. Se elemento ne estas “pli granda”, la listo ne estas ordigita.

Test-data for algoritme:
  • [1, 2, 3, 4, 5, 6], donas la respondon True.
  • [6, 17, 227, 1, 23, 42, 12], donas la respondon False
  • [2, -2, 2, -2, -2, 2] donas la respondon False.
  • [2, 2, 3, 4, 4, 6], donas la respondon True.
  • [12, 23, 34, 45, 56, 67], donas la respondon True.

Tips til framgangsmåte
  1. Kreu funkcion kiu prenas liston
  2. Uzu for-ciklon por trairi la tutan liston (uzu range al la longo de la listo, minus 1 len(list) - 1)
  3. Komparu elementon \(n\) kun \(n + 1\), do la nuna elemento kun la sekva elemento.
  4. Se \(n\) estas pli malgranda ol \(n + 1\), iru al la sekva komparo.
  5. Se ĝi ne estas pli malgranda, sed pli granda, tiam la listo ne estas ordigita. Redonu False ĉi tie.
  6. Se vi atingas la finon, tiam la listo estas ordigita, redonu True.

Svaret (i Python)
def is_sorted(the_list):
    for i in range(len(the_list) - 1):
        if the_list[i] > the_list[i + 1]:
            return False
    return True


Medium Tasko 8 - Miksado

Kreiu algoritmon kiu miksas liston de aĵoj. Ekzistas multaj manieroj fari tion, sed bona maniero estas tio, kio estas nomata Fisher-Yates miksada algoritmo. Vi povas legi pli pri tio ĉi tie Wikipedia.

Test Data
  • ["a", "b", "c", "d", "e"] → povas ekzemple fariĝi ["c", "e", "a", "d", "b"]
  • [1, 2, 3, 4, 5, 6] → povas ekzemple fariĝi [4, 1, 6, 3, 2, 5]
  • ["apple", "banana", "orange"] → povas ekzemple fariĝi ["orange", "apple", "banana"]
  • ["x"] → restas ankoraŭ ["x"]
  • [] → restas ankoraŭ []

Ĝi funkcias jene:

Algoritmen
  1. Kreu funkcion kiu prenas la liston de nombroj
  2. Kreu novan malplenan liston kiu devas teni la miksitan rezulton.
  3. Uzu random por elekti hazardan indekson en la listo.
  4. Aldonu ĉi tiun elementon al la malplena listo kaj forigu ĝin de la malnova
  5. Redonu la novan liston de la funkcio

Svaret (i Python)
import random

def shuffle(the_list):
    shuffled = []

    while len(the_list) > 0:
        i = random.randrange(0, len(the_list))
        shuffled.append(the_list[i])
        the_list.pop(i)

    return shuffled


Medium Tasko 9 - Bogo-sort

En ĉi tiu tasko vi devas krei (praktike) terura, sed ekstrema simple sorteran algoritmon. Ĝi estas ekstrema malbona kiam temas pri grandaj listoj (ĝi prenos eternumon kun pli ol 12-13 aĵoj). En Nivelo 2 ni kreos pli bonan sorteran algoritmon, bubble-sort.

Test Data
  • [3, 1, 2][1, 2, 3]
  • [5, 4, 3, 2, 1][1, 2, 3, 4, 5]
  • [10, 7, 8, 2][2, 7, 8, 10]
  • [1, 1, 1][1, 1, 1]
  • [9, 3, 6, 3, 9][3, 3, 6, 9, 9]
  • [0, -1, 4, -2][-2, -1, 0, 4]

La algoritmo funkcias jene:

Algoritmen
  1. Kreu funkcion kiu prenas la liston de netriitaj nombroj
  2. Miksu la liston hazarde (uzante mikson el tasko 8).
  3. Kontrolu ĉu la listo estas ordigita (uzante la kontrolon, kiun vi kreis en tasko 7).
  4. Se la listo ne estas ordigita, ripetu paŝojn 2 kaj 3.
  5. Ripetu ĝis la listo estas ordigita, poste returnu

Simple klarigite: bogo-sort miksas la tutan liston kaj esperas, ke ĝi estas ordigita.

Gru bogo sort meme
Legu pri Big O-notacio en Nivelo 2.

Indico: Eble uzu shuffle el tasko 8 por krei netriceitan liston por via algoritmo.

Svaret (i Python)
def bogo_sort(the_list):
    while not is_sorted(the_list):
        the_list = shuffle(the_list)
    return the_list


Hard Tasko 10a - Serĉu tekston - “subŝtringo” (Malfacila!)

Kreu algoritmon kiu povas trovi serĉvorton en teksto. Do, se vi havas frazon kiel hello there vi volus redoni True kun la serĉvorto hello, False kun serĉvorto kiel hahah. Ĉi tiu algoritmo devas funkcii sendepende de la eniro kaj eliro.

Uzu la tekstdatenojn sube por kontroli ĉu via algoritmo funkcias.

Test-data for algoritme:
  • hello there everyone kun there = True
  • hello there everyone kun ever = True
  • hello there everyone kun then = False
  • qwecvyufavsjekkftyergwcery kun sjekk = True

Tips til framgangsmåte
  1. Kreu funkcion, kiu prenas du string-ojn, datumojn kaj serĉvorton.
  2. Uzu for-ciklon kun range por trairi la tekston.
  3. Estas grave pensi pri kie la ciklo devas fini.
  4. Kreu temporan variablon, kiu diras ĉu la serĉvorto estis trovita, kaj agordu ĝin al True kiel defaŭlto.
  5. Uzu ankoraŭ unu for-ciklon kun range por kompreni kie vi estas en la teksto kun la serĉvorto.
  6. Se io en la serĉvorto ne kongruas kun kie vi kontrolas nun, agordu la temporan variablon al True kaj break el la interna ciklo.
  7. Se vi atingas la finon de la teksto sen trovi ion, redonu False.

Svaret (i Python)
def search(data, word): 
    for i in range(0, len(data) - len(word) + 1):
        found = True
        for j in range (0, len(word)):
            if data[i + j] != word[j]:
                found = False
                break
        if found:
            return True

    return False

Easy Tasko 10b

Aldonu ankaŭ plian kontrolon, kiu certigas, ke la serĉvorto ne estas pli longa ol la frazo.

Tips til framgangsmåte
  • Aldonu ĉi tiun kontrolon antaŭ la for-ciklo.

Svaret (i python)
def search(data, word): 
    if len(word) > len(data):
        return False

    for i in range(0, len(data) - len(word) + 1):
        found = True
        for j in range (0, len(word)):
            if data[i + j] != word[j]:
                found = False
                break
        if found:
            return True

    return False


Hard Tasko 11 - Invertigo de vortoj en frazo (Malfacila)

Memoru reen al Tasko 5 pri la invertigo de frazo. Modifu (aŭ komencu denove) por krei algoritmon kiu inversigas ĉiun apartan vorton en frazo, kaj poste kunigas ilin denove.

Test-data for algoritme:
  • hello there everyone fariĝas olleh ereht enoyreve
  • This is the way it goes! fariĝas sihT si eht yaw ti !seog
  • does this racecar go? of course! fariĝas seod siht racecar ?og fo !esruoc

Tips til framgangsmåte
  1. Kreu funkcion kiu prenas kiel argumenton string.
  2. ❗Disigu la tekston uzante .split(" ").
  3. Kreu temporan variablon por konservi la finvaloron.
  4. Uzu for-ciklon por trairi ĉiun vorton.
  5. Uzu la saman metodon por inversigo kiel en Tasko 5
  6. Uzu la rezulton kaj aldonu ĝin al la variablo, kiun vi kreis en paŝo 2.
  7. Redonu la finvaloron

Svaret (i Python)
def reverse_words(words):
    sentence = words.split(" ")
    output = ""

    for word in sentence:
        reversed_word = ""
        for i in range(0, len(word)):
            reversed_word = word[i] + reversed_word
        output += reversed_word + " "

    return output


➕Ekstra:

Kio estas “kiel” en programado?

En programado, “kiel” (angle mock) estas objekto, kiu imitas la konduton de vera objekto. Ĝi estas uzata por testi kodon, sen dependi de la vera objekto. Tiel, oni povas testi specifan funkcion aŭ metodon, sen ke la vera objekto estu disponebla aŭ funkcia.

Ekzemple, se vi volas testi funkcion, kiu alvokas datbazon, vi povas uzi “kiel”-objekton, kiu imitas la datbazon. Tiel, vi povas testi la funkcion, sen ke vi fakte konektu al la vera datbazo.

Kiam uzi “kiel”-objektojn?

“Kiel”-objektojn oni uzas, kiam:

  • Vi volas testi kodon, kiu dependas de eksteraj faktoroj, kiel datbazoj aŭ API-oj.
  • Vi volas izoli la kodon, kiun vi testas, de la resto de la sistemo.
  • Vi volas simuli erarajn situaciojn, por vidi, kiel la kodo reagadas.
  • Vi volas plibonigi la rapidecon de la testoj.

Kiel krei “kiel”-objekton?

Ekzistas diversaj manieroj por krei “kiel”-objekton. Unu maniero estas uzi bibliotekon aŭ kadron, kiu subtenas “kiel”-objektojn. Alia maniero estas krei la “kiel”-objekton mem, per programado.

Ekzemple, en Python, oni povas uzi la bibliotekon unittest.mock por krei “kiel”-objektojn. En Java, oni povas uzi la bibliotekon Mockito.

Avantaĝoj de uzo de “kiel”-objektoj

  • Pli rapida testado: “Kiel”-objektoj estas pli rapidaj ol la vera objekto, do testoj finiĝas pli rapide.
  • Izolita testado: “Kiel”-objektoj izolas la testatan kodon, do testoj estas pli fidindaj.
  • Simulado de eraroj: “Kiel”-objektoj permesas simuli erarajn situaciojn, do oni povas testi, kiel la kodo reagadas.
  • Pli bona kodelego: Uzo de “kiel”-objektoj povas plibonigi la kodelegon, ĉar ĝi klarigas la dependecojn de la kodo.

Cracked Tasko E1 - Forigi duplikatojn el listo

Diru ke vi havas liston kiu enhavas nombrojn, aŭ tekston, sed ni volas forigi la duplikatojn. Kreu algoritmon kiu forigas ĉiujn duplikatojn el listo kaj enhavas nur la unuan de ĉiu unika elemento kiu ekzistas en la listo.

Tips til framgangsmåte
  1. Komencu per funkcio kiu prenas liston
  2. Ni uzos while-ciklojn anstataŭ for. Tio faciligas en Python, en aliaj lingvoj for kun nombrilaj variabloj funkcias bone.
  3. Kreu nombrilan variablon idx (por indexo, aŭ i)
  4. Uzu while-ciklon kiu iru ĝis la longo de la listo
  5. Ni volas kompreni la elementon je idx kun ĉiuj aliaj elementoj
  6. Kreu nombrilan variablon al jdx (aŭ j) kiu komenciĝas je idx + 1
  7. Komparu elementon je idx kun elemento je jdx, se ili estas egalaj, forigu jdx uzante pop(jdx).
  8. MEMORU! Se vi forigas la elementon, la listo fariĝas pli malgranda, do ni devas paŝi reen per jdx -= 1.
  9. Pliigu jdx per 1 kaj testu la sekvan elementon
  10. Post la interna while-ciklo, pliigu idx per 1 kaj la ekstera while-ciklo daŭros
  11. Fine, redonu la liston kun forigitaj duplikatoj

Test Data
  • [1, 2, 2, 3, 1, 4, 3] → iĝas [1, 2, 3, 4]
  • ["a", "b", "a", "c", "b", "d"] → iĝas ["a", "b", "c", "d"]
  • [5, 5, 5, 5] → iĝas [5]
  • ["x", "y", "z", "x", "y", "x"] → iĝas ["x", "y", "z"]
  • [10, -1, 10, -1, 0, 0, 10] → iĝas [10, -1, 0]
  • ["apple", "apple', "banana", "orange", "apple", "orange", "pear", "apple"]
    • Devus doni: ["apple", "banana", "orange", "pear"]

Svaret (i Python)
def delete_duplicates(the_list):
    idx = 0

    while idx < len(the_list):
        jdx = idx + 1

        while jdx < len(the_list):
            if the_list[idx] == the_list[jdx]:
                the_list.pop(jdx)
                jdx -= 1
            jdx += 1
        idx += 1

    return the_list


Cracked Task E2 - Counting Sort

Counting sort estas unu el la malmultaj sortaj algoritmoj kiuj funkcias en tio, kion ni nomas \(O(n)\) tempo. Tio estas, ĝi ne prenas multe pli da tempo ol la nombro da elementoj en la listo. Legu pli pri Big O-notacio en Nivelo 2.

Ĝi iomete dependas de kiom granda la intervalo de elementoj estas. Se la plej malgranda estas 0 kaj la plej granda estas 100000, ĝi povas preni iom da tempo, do ĉi tiu povas esti uzata se la intervalo de valoroj estas malgranda. Ĝi ankaŭ ne funkcias por negativaj nombroj, sed estas eble modifi la algoritmon por funkcii kun negativaj nombroj.

La algoritmo funkcias tiel:

  • Trovu kiom granda la plej granda elemento estas, konservu la valoron de ĉi tiu elemento kiel \(k\).
  • Kreu liston kiu enhavas \(k + 1\) elementojn, count.
  • Trairu la netritan liston kaj uzu la valoron de la nombro kiel indekso. Tio estas, se la elemento havas la valoron 47, tiam vi iras al count[47] kaj pligrandigas ĝin je 1.
  • Trairu la count liston kaj metu la nombron da nombroj kiel la indekso estas. Ekzemple: Se estas 3 ĉe indekso 1, tiam vi aldonas tri 1-nombrojn.

Testdata
Nesortitaj Datumoj Sortitaj Datumoj
[7, 3, 9, 1, 4, 3, 0, 6, 8, 6, 2, 1, 9, 0, 5, 4] [0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 9]
[12, 13, 15, 0, 8, 15, 8, 5, 16, 8, 0, 20, 4, 9, 17, 16, 1, 3, 6, 15, 5, 2, 3, 1, 19, 13, 17, 5, 3, 10] [0, 0, 1, 1, 2, 3, 3, 3, 4, 5, 5, 5, 6, 8, 8, 8, 9, 10, 12, 13, 13, 15, 15, 15, 16, 16, 17, 17, 19, 20]

Tips til framgangsmåte
  1. Komencu per krei funkcion kun listo kiel eniro
  2. Kriu malplenan liston output
  3. Uzu for-ciklon por trairi la tutan liston
  4. Zorgu pri la maksimuma valoro en variablo antaŭ la for-ciklo
  5. Aktualigu la maksimuman valoron se vi trovas ion pli grandan
  6. Kriu liston kiu enhavas tiun nombron da nuloj + 1. Ekzemple: la plej granda valoro estas 47, tiam vi kreas liston kun 48 nuloj. Vi povas fari tion per [0] * (maks + 1), aŭ for-ciklo. Nomu ĝin count.
  7. Trairu la liston denove per for-ciklo
  8. Uzu la valoron de la elemento kiel indekson kaj pligrandigu per 1. count[value] += 1
  9. Uzu for-ciklon por trairi la liston count.
  10. Uzu la valoron kiu estas ĉe ĉiu indekso por aldoni tiun nombron da nombroj
  11. Redonu la ordigitan liston

Svaret (i Python)
def counting_sort(input_list):
    output = []

    max_val = input_list[0]

    for n in input_list:
        if n > max_val:
            max_val = n

    # tio kreas amason da nuloj
    count = [0] * (max_val + 1)

    for n in input_list:
        count[n] += 1

    for i in range(len(count)):
        # uzu _ por ignori valoron
        for _ in range(count[i]):
            output.append(i)

    return output