Valinnan lajittelu: Algoritmi selitetty Python Koodiesimerkki
Mikรค on valintalajittelu?
VALINTA LAJITTELU on vertailulajittelualgoritmi, jota kรคytetรครคn lajittelemaan satunnainen luettelo kohteista nousevaan jรคrjestykseen. Vertailu ei vaadi paljon ylimรครคrรคistรค tilaa. Se vaatii vain yhden ylimรครคrรคisen muistitilan aikamuuttujalle.
Tรคtรค kutsutaan nimellรค paikallaan lajittelu. Valintalajittelun aikamonimutkaisuus on O(n2) jossa n on luettelon kohteiden kokonaismรครคrรค. Aikamonimutkaisuus mittaa luettelon lajitteluun tarvittavien iteraatioiden mรครคrรครค. Luettelo on jaettu kahteen osioon: Ensimmรคinen luettelo sisรคltรครค lajitellut kohteet, kun taas toinen luettelo sisรคltรครค lajittelemattomat kohteet.
Oletusarvoisesti lajiteltu luettelo on tyhjรค ja lajittelematon luettelo sisรคltรครค kaikki elementit. Lajittelemattomasta luettelosta etsitรครคn sitten vรคhimmรคisarvo, joka sijoitetaan sitten lajiteltuun luetteloon. Tรคtรค prosessia toistetaan, kunnes kaikkia arvoja on verrattu ja lajiteltu.
Miten valintalajittelu toimii?
Lajittelemattoman osion ensimmรคistรค kohdetta verrataan kaikkiin oikealla oleviin arvoihin sen tarkistamiseksi, onko se pienin arvo. Jos se ei ole minimiarvo, sen sijainti vaihdetaan minimiarvoon.
esimerkki
- Jos esimerkiksi minimiarvon indeksi on 3, indeksin 3 elementin arvo sijoitetaan indeksiin 0, kun taas indeksissรค 0 ollut arvo sijoitetaan indeksiin 3. Jos lajittelemattoman osion ensimmรคinen elementti on vรคhimmรคisarvon, niin se palauttaa asemansa.
- Elementti, joka on mรครคritetty minimiarvoksi, siirretรครคn sitten vasemmalla olevaan osioon, joka on lajiteltu luettelo.
- Osioidulla puolella on nyt yksi elementti, kun taas osittamattomalla puolella on (n โ 1) elementtiรค, missรค n on listan elementtien kokonaismรครคrรค. Tรคmรค prosessi toistetaan yhรค uudelleen, kunnes kaikkia kohteita on verrattu ja lajiteltu niiden arvojen perusteella.
Ongelman mรครคrittely
Luettelo elementeistรค, jotka ovat satunnaisessa jรคrjestyksessรค, on lajiteltava nousevaan jรคrjestykseen. Harkitse seuraavaa luetteloa esimerkkinรค.
[21,6,9,33,3]
Yllรค oleva luettelo tulee lajitella seuraavien tulosten saamiseksi
[3,6,9,21,33]
Ratkaisu (algoritmi)
Vaihe 1) Hanki n:n arvo, joka on taulukon kokonaiskoko
Vaihe 2) Jaa luettelo lajiteltuihin ja lajittelemattomiin osiin. Lajiteltu osio on aluksi tyhjรค, kun taas lajittelematon osio sisรคltรครค koko luettelon
Vaihe 3) Valitse vรคhimmรคisarvo osittamattomasta osiosta ja sijoita se lajiteltuun osioon.
Vaihe 4) Toista prosessi (n โ 1) kertaa, kunnes kaikki luettelon elementit on jรคrjestetty.
Visuaalinen esitys
Kun annetaan viiden elementin luettelo, seuraavat kuvat havainnollistavat, kuinka valintalajittelualgoritmi toistuu arvojen lรคpi lajitellessaan niitรค.
Seuraava kuva nรคyttรครค lajittelemattoman luettelon
Vaihe 1)
Ensimmรคistรค arvoa 21 verrataan muihin arvoihin sen tarkistamiseksi, onko se pienin arvo.
3 on minimiarvo, joten paikat 21 ja 3 vaihdetaan. Vihreรคllรค taustalla olevat arvot edustavat luettelon lajiteltua osiota.
Vaihe 2)
Arvoa 6, joka on lajittelemattoman osion ensimmรคinen elementti, verrataan muihin arvoihin sen selvittรคmiseksi, onko olemassa pienempi arvo
Arvo 6 on minimiarvo, joten se sรคilyttรครค asemansa.
Vaihe 3)
Lajittelemattoman luettelon ensimmรคistรค elementtiรค, jonka arvo on 9, verrataan muihin arvoihin sen tarkistamiseksi, onko se pienin arvo.
Arvo 9 on pienin arvo, joten se sรคilyttรครค asemansa lajitetussa osiossa.
Vaihe 4)
Arvoa 33 verrataan muihin arvoihin.
Arvo 21 on pienempi kuin 33, joten paikat vaihdetaan yllรค olevan uuden listan tuottamiseksi.
Vaihe 5)
Meillรค on vain yksi arvo jรคljellรค osittamattomassa luettelossa. Siksi se on jo lajiteltu.
Lopullinen lista on samanlainen kuin yllรค olevassa kuvassa.
Valinta Lajittele ohjelma kรคyttรคen Python 3
Seuraava koodi nรคyttรครค valintalajittelun toteutuksen kรคyttรคmรคllรค Python 3
def selectionSort( itemsList ):
n = len( itemsList )
for i in range( n - 1 ):
minValueIndex = i
for j in range( i + 1, n ):
if itemsList[j] < itemsList[minValueIndex] :
minValueIndex = j
if minValueIndex != i :
temp = itemsList[i]
itemsList[i] = itemsList[minValueIndex]
itemsList[minValueIndex] = temp
return itemsList
el = [21,6,9,33,3]
print(selectionSort(el))
Suorita yllรค oleva koodi tuottaa seuraavat tulokset
[3, 6, 9, 21, 33]
Koodin selitys
Koodin selitys on seuraava
Tรคssรค koodin selitys:
- Mรครคrittรครค toiminnon nimeltรค selectionSort
- Hakee luettelon elementtien kokonaismรครคrรคn. Tarvitsemme tรคtรค mรครคrittรครคksemme suoritettavien siirtojen lukumรครคrรคn arvojen vertailussa.
- Ulompi silmukka. Kรคyttรครค silmukkaa listan arvojen iterointiin. Iteraatioiden mรครคrรค on (n โ 1). Arvo n on 5, joten (5 โ 1) antaa meille 4. Tรคmรค tarkoittaa, ettรค ulommat iteraatiot suoritetaan 4 kertaa. Jokaisessa iteraatiossa muuttujan i arvo mรครคrรคtรครคn muuttujalle minValueIndex
- Sisรคinen silmukka. Kรคyttรครค silmukkaa vertaamaan vasemmanpuoleisinta arvoa muihin oikean puolen arvoihin. Arvo j:lle ei kuitenkaan ala indeksistรค 0. Se alkaa arvosta (i + 1). Tรคmรค sulkee pois arvot, jotka on jo lajiteltu, joten keskitymme tuotteisiin, joita ei ole vielรค lajiteltu.
- Etsii vรคhimmรคisarvon lajittelemattomasta luettelosta ja sijoittaa sen oikeaan paikkaan
- Pรคivittรครค minValueIndexin arvon, kun vaihtoehto on tosi
- Vertaa indeksilukujen minValueIndex ja i arvoja nรคhdรคkseen, eivรคtkรถ ne ole yhtรค suuret
- Vasemmanpuoleisin arvo on tallennettu ajalliseen muuttujaan
- Alempi arvo oikealta ottaa ensimmรคisen aseman
- Temporaaliarvoon tallennettu arvo tallennetaan asemaan, joka oli aiemmin minimiarvon hallussa
- Palauttaa lajitellun luettelon funktiotuloksena
- Luo listan, jossa on satunnaislukuja
- Tulosta lajiteltu lista sen jรคlkeen, kun olet kutsunut lajittelufunktion valinnan, joka ohittaa parametrina el.
Aika monimutkaisuus Valinnan Lajittelu
Lajittelun monimutkaisuutta kรคytetรครคn ilmaisemaan, kuinka monta suorituskertaa luettelon lajitteluun kuluu. Toteutuksessa on kaksi silmukkaa.
Ulompi silmukka, joka poimii arvot yksitellen listasta, suoritetaan n kertaa, missรค n on listan arvojen kokonaismรครคrรค.
Sisรคinen silmukka, joka vertaa ulkoisen silmukan arvoa muihin arvoihin, suoritetaan myรถs n kertaa, missรค n on listan elementtien kokonaismรครคrรค.
Siksi suoritusten lukumรครคrรค on (n * n), joka voidaan myรถs ilmaista muodossa O(n2).
Valintalajittelussa on kolme monimutkaisuusluokkaa, nimittรคin;
- Pahimmassa tapauksessa โ tรคssรค annettu luettelo on laskevassa jรคrjestyksessรค. Algoritmi suorittaa maksimimรครคrรคn suorituksia, joka ilmaistaan โโ[Big-O] O(n2)
- Paras tapaus โ tรคmรค tapahtuu, kun annettu luettelo on jo lajiteltu. Algoritmi suorittaa minimimรครคrรคn suorituksia, joka ilmaistaan โโ[Big-Omega] ?(n2)
- Keskimรครคrรคinen tapaus โ tรคmรค tapahtuu, kun luettelo on satunnaisessa jรคrjestyksessรค. Keskimรครคrรคinen monimutkaisuus ilmaistaan โโ[Big-theta] ?(n2)
Valintalajittelun tilamonimutkaisuus on O(1), koska se vaatii yhden aikamuuttujan, jota kรคytetรครคn arvojen vaihtamiseen.
Milloin valintalajittelua kรคytetรครคn?
Valintalajittelu on parasta kรคyttรครค, kun haluat:
- Sinun on lajiteltava pieni luettelo kohteista nousevaan jรคrjestykseen
- Kun arvojen vaihtokustannukset ovat merkityksettรถmรคt
- Sitรค kรคytetรครคn myรถs silloin, kun sinun on varmistettava, ettรค kaikki luettelon arvot on tarkistettu.
Valikoimalajittelun edut
Seuraavat ovat valintalajittelun edut
- Se toimii erittรคin hyvin pienillรค listoilla
- Se on paikallaan oleva algoritmi. Se ei vaadi paljon tilaa lajitteluun. Aikamuuttujan pitรคmiseen tarvitaan vain yksi lisรคtila.
- Se toimii hyvin kohteissa, jotka on jo lajiteltu.
Valikoimalajittelun haitat
Seuraavat ovat valintalajittelun haitat.
- Se toimii huonosti kรคytettรคessรค suuria listoja.
- Lajittelun aikana tehtyjen iteraatioiden mรครคrรค on n-neliรถ, jossa n on listan elementtien kokonaismรครคrรค.
- Muilla algoritmeilla, kuten pikalajittelulla, on parempi suorituskyky verrattuna valintalajitteluun.
Yhteenveto
- Valintalajittelu on paikallaan oleva vertailualgoritmi, jota kรคytetรครคn satunnaisluettelon lajitteluun jรคrjestetyksi luetteloksi. Sen aikamonimutkaisuus on O(n2)
- Luettelo on jaettu kahteen osaan, lajiteltuun ja lajittelemattomaan. Minimiarvo poimitaan lajittelemattomasta osiosta ja sijoitetaan lajiteltuun osuuteen.
- Tรคtรค toistetaan, kunnes kaikki kohteet on lajiteltu.
- Pseudokoodin kรคyttรถรถnotto sisรครคn Python 3 sisรคltรครค kahden for-silmukan ja if-lauseiden kรคyttรคmisen sen tarkistamiseksi, onko vaihto tarpeen
- Aika monimutkaisuus mittaa luettelon lajitteluun tarvittavien vaiheiden mรครคrรครค.
- Pahimman mahdollisen ajan monimutkaisuus tapahtuu, kun luettelo on laskevassa jรคrjestyksessรค. Sen aikakompleksisuus on [Big-O] O(n2)
- Parhaassa tapauksessa aika monimutkaisuus tapahtuu, kun luettelo on jo nousevassa jรคrjestyksessรค. Sen aikamonimutkaisuus on [Big-Omega] ?(n2)
- Keskimรครคrรคinen tapauksen aika monimutkaisuus tapahtuu, kun luettelo on satunnaisessa jรคrjestyksessรค. Sen aikamonimutkaisuus on [Big-theta] ?(n2)
- Valintalajittelu on parasta kรคyttรครค, kun sinulla on pieni lista lajiteltavista kohteista, arvojen vaihtamisen hinnalla ei ole vรคliรค ja kaikkien arvojen tarkistaminen on pakollista.
- Valintalajittelu ei toimi hyvin suurilla listoilla
- Muilla lajittelualgoritmeilla, kuten pikalajittelulla, on parempi suorituskyky verrattuna valintalajitteluun.












