Return to Video

Sortiranje umetanjem u Python-u

  • 0:00 - 0:02
    Ono što ću uraditi u ovom snimku je
  • 0:02 - 0:04
    pokušaj pravljenja implementacije
  • 0:04 - 0:07
    algoritma za sortiranje umetanjem
  • 0:07 - 0:08
    o kom smo pričali u prethodnom snimku.
  • 0:08 - 0:10
    Napraviću to kao Python funkciju.
  • 0:10 - 0:16
    Dakle, pozvaću Python funkciju insertion_sort()
  • 0:16 - 0:18
    koja će primiti listu...
  • 0:18 - 0:21
    dakle lista je parametar u definiciji funkcije...
  • 0:21 - 0:23
    tako da ćemo morati da je prosledimo
    u listi argumenata.
  • 0:23 - 0:25
    I hajde da... ono što ćemo uraditi je da
  • 0:25 - 0:30
    prođemo kroz sva mesta u listi.
  • 0:30 - 0:31
    Pretpostavljam da bi to mogli tako reći.
  • 0:31 - 0:36
    Dakle, kažemo *for index in range()*.
  • 0:36 - 0:39
    Mogli bi krenuti od krajnjeg levog mesta u listi.
  • 0:39 - 0:41
    Tako da možemo prosto reći len()...
  • 0:41 - 0:43
    len samo znači... to je skraćeno od "length"...
  • 0:43 - 0:45
    dakle, dužine liste.
  • 0:45 - 0:46
    Tako da ono što bi se desilo je
  • 0:46 - 0:48
    da bi indeks počeo...
  • 0:48 - 0:50
    hajde da kažemo da lista ima u sebi četiri elementa...
  • 0:50 - 0:52
    onda bi len(list), ovo upravo ovde,
  • 0:52 - 0:54
    bilo 4, izvršenje bi dalo 4.
  • 0:54 - 0:57
    Range(4) bi dalo listu
  • 0:57 - 1:00
    koja ima elemente [0, 1, 2, 3] u sebi.
  • 1:00 - 1:02
    I tako, index bi mogao da prođe kroz
  • 1:02 - 1:06
    sve različite indekse ove liste ovde.
  • 1:06 - 1:07
    I to bi mogli tako da uradimo,
  • 1:07 - 1:11
    ali možda se sećate iz prethodnog snimka
  • 1:11 - 1:14
    da kada se radi sortiranje umetanjem
  • 1:14 - 1:15
    u suštini, nema smisla
  • 1:15 - 1:17
    početi od skroz levog elementa.
  • 1:17 - 1:20
    Jer on nema ništa s leve strane sa čime bi se poredio.
  • 1:20 - 1:21
    Tako da u stvari možemo početi
  • 1:21 - 1:23
    od drugog elementa s leve strane.
  • 1:23 - 1:26
    A skroz levi element je nulti element,
  • 1:26 - 1:28
    tako da možemo krenuti od prvog elementa.
  • 1:28 - 1:30
    Tako da sad, ako je lista dužine 4,
  • 1:30 - 1:33
    ovo ovde će dati [1, 2, 3].
  • 1:33 - 1:36
    Dakle, 1 bi bio drugi element s leva.
  • 1:36 - 1:37
    2 bi bio sledeći na desno.
  • 1:37 - 1:39
    3 bi bio poslednji.
  • 1:39 - 1:42
    Zapamtite, sa indeksima uvek počinjemo od 0...
  • 1:42 - 1:46
    nulti element je skroz levi element u listi.
  • 1:46 - 1:48
    Lepo, sada možemo proći kroz sve to-
  • 1:48 - 1:52
    Uzmimo vrednost - u tom trenutku vremena -
  • 1:52 - 1:56
    elementa koji je pod tim indeksom.
  • 1:56 - 1:58
    Na taj način ne moramo stalno da ga tražimo,
  • 1:58 - 2:02
    vrednost je jednaka list[index].
  • 2:02 - 2:04
    I ovo sigurno neće biti
  • 2:04 - 2:05
    najefikasnija implementacija,
  • 2:05 - 2:07
    čak ni za sortiranje umetanjem.
  • 2:07 - 2:09
    Ovo će biti moj najbolji pokušaj,
  • 2:09 - 2:10
    pisanja u realnom vremenu,
  • 2:10 - 2:11
    i na način koji će, nadam se...
  • 2:11 - 2:13
    koji ćete moći da razumete.
  • 2:13 - 2:15
    Dakle, value je samo stavka u listi
  • 2:15 - 2:17
    na svakom od ovih indeksa
  • 2:17 - 2:19
    koje ćemo sada uporediti
  • 2:19 - 2:21
    sa svim elementima sa njihove leve strane.
  • 2:21 - 2:25
    A ono što želim da uradim je da...
  • 2:25 - 2:28
    poredim vrednost... želim da poredim vrednost
  • 2:28 - 2:31
    sa svakim elementom sa njegove leve strane.
  • 2:31 - 2:33
    Stoga, definišimo promenljivu i
  • 2:33 - 2:36
    i postavimo je da bude indeks onih stvari
  • 2:36 - 2:38
    sa kojima želim da uporedim value.
  • 2:38 - 2:40
    I odmah s početka
  • 2:40 - 2:42
    želim da poredim value sa onim sa njegove leve strane.
  • 2:42 - 2:44
    Dakle, i treba da bude
  • 2:44 - 2:47
    za jedan manji indeks u odnosu na index.
  • 2:47 - 2:50
    Dakle, *index - 1*.
  • 2:50 - 2:52
    To je indeks elementa
  • 2:52 - 2:53
    koji je odmah levo od njega.
  • 2:53 - 2:55
    Ali mi ćemo nastaviti da smanjujemo i i dalje.
  • 2:55 - 2:57
    Tako možemo da nastavimo da poredimo value
  • 2:57 - 3:00
    sa stvarima dalje i dalje na levu stranu.
  • 3:00 - 3:02
    I ono što želimo da uradimo je da...
  • 3:02 - 3:06
    želimo da nastavimo sa poređenjem
    sve dalje i dalje na levo
  • 3:06 - 3:09
    dok i ne ode skroz do početka liste.
  • 3:09 - 3:12
    A i je otišlo skroz do početka liste
  • 3:12 - 3:14
    onda kada postane jednako 0.
  • 3:14 - 3:15
    Dakle, ono što želimo da uradimo je,
  • 3:15 - 3:16
    želimo da ovo izvršavamo
  • 3:16 - 3:20
    dok je i veće ili jednako 0.
  • 3:20 - 3:22
    Jer ako nastavimo da smanjujemo i sve više i više,
  • 3:22 - 3:24
    odlazićemo sve dalje i dalje
  • 3:24 - 3:25
    na levu stranu liste.
  • 3:25 - 3:26
    Ne želimo da to izvršavamo
  • 3:26 - 3:29
    kada je i.... znate--- dalje.... kada je negativan broj...
  • 3:29 - 3:31
    to će samo početi da proizvodi lude pojave.
  • 3:31 - 3:35
    Dakle, dok je i veće ili jednako 0...
  • 3:35 - 3:36
    ono što ću uraditi je
  • 3:36 - 3:41
    da nastavim da guiram i dalje i dalje na levo.
  • 3:41 - 3:43
    Pokušajmo to na ovaj način,
    i prva stvar koju želim da uradim...
  • 3:43 - 3:44
    već smo jednom izgurali na levo.
  • 3:44 - 3:47
    Hajde da uporedimo...
  • 3:47 - 3:54
    dakle, ako je value manje od...
  • 3:54 - 3:56
    ova stvar uporno daje sintaksnu grešku
  • 3:56 - 3:58
    jer me čeka da nastavim da kuckam...
  • 3:58 - 4:04
    ako value bude manje
    od elementa koji je sada na indeksu i.
  • 4:04 - 4:07
    Dakle, element na indeksu i... list[i]
  • 4:07 - 4:10
    element na indeksu i je upravo ovaj ovde.
  • 4:10 - 4:12
    Ako je manji od toga,
  • 4:12 - 4:15
    hajde da pomerimo element koji je ovde...
  • 4:15 - 4:17
    pomerimo ga jednom na desno.
  • 4:17 - 4:20
    Tako da je pravo mesto *i + 1*
  • 4:20 - 4:22
    i ja ne mogu reći da je to index
  • 4:22 - 4:24
    jer setite se da nastavljam da odvlačim i
  • 4:24 - 4:25
    na sve manje i manje i manje.
  • 4:25 - 4:29
    Jer, upravo sada, i je *index - 1*
  • 4:29 - 4:31
    u prvom prolasku kroz ovu while petlju,
  • 4:31 - 4:33
    ali ja ću... kao što ćete videti za sekund...
  • 4:33 - 4:34
    ja ću nastaviti da smanjujem i,
  • 4:34 - 4:37
    tako da neće uvek biti za jedan levo od index.
  • 4:37 - 4:40
    Zato ću reći, gde god da je i,
  • 4:40 - 4:42
    hajde da uzmemo mesto za jedan s desne strane od i...
  • 4:42 - 4:45
    jedno mesto od... jednom na desno od...
  • 4:45 - 4:47
    dakle, njegov indeks je *i + 1*.
  • 4:47 - 4:51
    I hajde da zamenimo to sa šta god da je na list[i],
  • 4:51 - 4:55
    šta god da je na i, na mestu i.
  • 4:55 - 4:57
    Mi u suštini uzimamo ovu stvar ovde,
  • 4:57 - 5:00
    koji god da je broj bio tu.
  • 5:00 - 5:01
    I stavljamo na mesto
  • 5:01 - 5:04
    koje je za jedno mesto s desne strane od njega.
    A onda,
  • 5:04 - 5:06
    i zapravo na način na koji smo pripremili taj algoritam.
  • 5:06 - 5:08
    Šta god da se desi da je tu...
  • 5:08 - 5:09
    Zapravo... neću o tome pričati.
  • 5:09 - 5:12
    Proći ćemo kroz to i videti kako se to sve odigrava.
  • 5:12 - 5:16
    I tada možemo da pomerimo value ulevo.
  • 5:16 - 5:19
    Tako da, šta god da je bilo na tom mestu,
  • 5:19 - 5:21
    biće zamenjeno sa value.
  • 5:21 - 5:26
    Tako će list[i] postati jednako sa value.
  • 5:26 - 5:28
    I jedan način da o tome mislimo
  • 5:28 - 5:29
    - napisaću komentar ovde -
  • 5:29 - 5:34
    pomeri ono što je...
  • 5:34 - 5:42
    pomeri broj sa mesta i na mesto *i + 1*
  • 5:42 - 5:44
    ili u stvari kontejner na *i + 1*...
  • 5:44 - 5:46
    pretpostavljam da je to jedan način da to zamislimo...
  • 5:46 - 5:48
    I onda možete reći,
  • 5:48 - 5:51
    pomeri broj na desno... nazvaću to tako...
  • 5:51 - 5:54
    pomeri broj desno, na mesto...
  • 5:54 - 5:55
    pisaćemo to na ovaj način...
  • 5:55 - 6:00
    pomeri broj na mestu i desno na mesto *i + 1*
  • 6:00 - 6:05
    A onda ovde, mi pomeramo...
  • 6:05 - 6:14
    pomerimo vrednost levo na mesto i.
  • 6:14 - 6:15
    I tako, ako se sećate šta smo radili
    u prethodnom snimku,
  • 6:15 - 6:17
    to tačno opisuje ovo.
  • 6:17 - 6:19
    Mi poredimo value sa onim što mu je sa leve strane.
  • 6:19 - 6:20
    Ako je manje od njega,
  • 6:20 - 6:24
    onda bez obzira na broj koji se nalazi na
    mestu s njegove leve strane,
  • 6:24 - 6:27
    pomeri ga na desno i onda pomeri value na levo.
  • 6:27 - 6:29
    A sada hajde da uporedimo value
  • 6:29 - 6:31
    sa nečim što je manje od njega.
  • 6:31 - 6:34
    Želimo da dekrementiramo i, želimo da ga smanjimo...
  • 6:34 - 6:36
    dekrementiranje je u stvari inkrementiranje na dole.
  • 6:36 - 6:41
    Tako da će i postati jednako *i - 1*,
  • 6:41 - 6:44
    a onda ćemo izvršiti petlju ponovo.
  • 6:44 - 6:46
    I sada će value biti upoređeno...
  • 6:46 - 6:48
    sada je i za dva levo od index...
  • 6:48 - 6:50
    u poređenju s tim...
  • 6:50 - 6:52
    ako je manje od toga, pomeri ga na desno
  • 6:52 - 6:54
    i pomeri value ponovo na levo.
  • 6:54 - 6:56
    A sada, šta ako imamo situaciju
  • 6:56 - 6:58
    gde value nije manje od
  • 6:58 - 7:01
    elementa sa kojim ga poredite?
  • 7:01 - 7:03
    Pa, ako nije manje od elementa sa kojim ga poredite,
  • 7:03 - 7:07
    to znači da je value već sada na pravom mestu.
  • 7:07 - 7:09
    To takođe znači da ste završili,
  • 7:09 - 7:11
    i da ne morate dalje da pomerate value na levo.
  • 7:11 - 7:13
    I ne morate više da pomerate stvari na levo
  • 7:13 - 7:14
    niti na desno.
  • 7:14 - 7:18
    Tako da - završili smo.
  • 7:18 - 7:20
    i mislim da bi ovo trebalo da radi
  • 7:20 - 7:22
    osim ako sam napravio neku blesavu grešku.
  • 7:22 - 7:25
    Dakle, hajde da probamo da vidimo da li bi mogao da...
  • 7:25 - 7:28
    da li ovo zapravo radi kao algoritam za sortiranje.
  • 7:28 - 7:31
    Sačuvaću to, insertion_sort,
  • 7:31 - 7:33
    i pokrenuti.
  • 7:33 - 7:35
    Dobro, dakle nisam imao nikakvih,
    barem ne sintaksnih, grešaka.
  • 7:35 - 7:38
    Sintaksa samo znači da su karakteri koje sam koristio...
  • 7:38 - 7:40
    nisam zaboravio da stavim zarez ovde ili znak veće...
  • 7:40 - 7:44
    u suštini, uspeo je da obradi ovo,
  • 7:44 - 7:46
    da interpretira sve ovo ovde.
  • 7:46 - 7:47
    Ali hajde da vidimo da li to zapravo radi.
  • 7:47 - 7:50
    Definisaću listu a.
  • 7:50 - 8:00
    Recimo [7, 1, 3, 5, 9, 2]
  • 8:00 - 8:02
    i dodaću još jedno 3 ovde.
  • 8:02 - 8:03
    To je dakle a.
  • 8:03 - 8:05
    Onda hajde da vidimo... ovo je trenutak istine.
  • 8:05 - 8:10
    insertion_sort(a), hajde da vidimo šta se dešava.
  • 8:10 - 8:13
    I zapamtite, mi sortiramo u mestu,
  • 8:13 - 8:14
    ova funkcija ne vraća ništa.
  • 8:14 - 8:16
    Ali bi trebala da uzme listu kakva god da je,
  • 8:16 - 8:18
    i da joj izmeni sve elemente
  • 8:18 - 8:19
    tako da sada budu poređani po veličini.
  • 8:19 - 8:21
    Ovo je dakle momenat istine.
  • 8:21 - 8:24
    Hajde da vidimo na šta a liči.
  • 8:24 - 8:25
    Eto ga! Sortirano je.
  • 8:25 - 8:28
    Dakle, mislim da nisam napravio nikakve velike greške.
  • 8:28 - 8:30
    I to vam je to.
  • 8:30 - 8:36
    Imate verziju sortiranja umetanjem.
Title:
Sortiranje umetanjem u Python-u
Description:

Osnovna implementacija algoritma za sortiranje umetanjem.

more » « less
Video Language:
English
Duration:
08:36

Serbian subtitles

Revisions