Ciklično sortiranje — разлика између измена

С Википедије, слободне енциклопедије
Садржај обрисан Садржај додат
Нема описа измене
Autobot (разговор | доприноси)
м Разне исправке; козметичке измене
Ред 5: Ред 5:
| širina slike=250
| širina slike=250
| struktura=[[Niz]]
| struktura=[[Niz]]
| namena=[[Алгоритми_сортирања|sortiranje]]
| namena=[[Алгоритми сортирања|sortiranje]]
| vkompleksnost= ''-{[[Велико_O|O]](n²)}-''
| vkompleksnost= ''-{[[Велико O|O]](n²)}-''
| mkompleksnost=-{[[Велико_O|O]](n)}-''
| mkompleksnost=-{[[Велико O|O]](n)}-''
| stabilan=ne
| stabilan=ne
}}
}}
'''Ciklično sortiranje''' predstavlja nestabilni, in-place [[algoritam]] za sortiranje, pripada grupi [[Алгоритми_сортирања#Алгоритми сортирања поређењем|sortiranja poredjenjem]] i optimalan je u smislu ukupnog broja upisivanja u niz. Zasniva se na ideji da se [[permutacija]] koju treba sortirati može podeliti na cikluse. Zatim rotiramo cikluse da bi dobili sortiran niz. Vremenska složenost algoritma je [[Велико_О|O]](n²).
'''Ciklično sortiranje''' predstavlja nestabilni, in-place [[algoritam]] za sortiranje, pripada grupi [[Алгоритми сортирања#Алгоритми сортирања поређењем|sortiranja poredjenjem]] i optimalan je u smislu ukupnog broja upisivanja u niz. Zasniva se na ideji da se [[permutacija]] koju treba sortirati može podeliti na cikluse. Zatim rotiramo cikluse da bi dobili sortiran niz. Vremenska složenost algoritma je [[Велико О|O]](n²).


Za razliku od skoro svakog drugog sortiranja, ovde se elementi nikada ne upisuju negde u nizu samo da bi bili sklonjeni sa puta. Svaka vrednost je upisana ili nula puta, ako je već na svom mestu, ili tačno jednom, na svoju poziciju. Ovim se postiže minimalan broj upisivanja za kompletno in-place sortiranje.
Za razliku od skoro svakog drugog sortiranja, ovde se elementi nikada ne upisuju negde u nizu samo da bi bili sklonjeni sa puta. Svaka vrednost je upisana ili nula puta, ako je već na svom mestu, ili tačno jednom, na svoju poziciju. Ovim se postiže minimalan broj upisivanja za kompletno in-place sortiranje.
Minimizacija broja pisanja veoma je korisna kada je zapisivanje podataka skupo, npr na [[EEPROM]]-u ili [[Флеш_меморија|fleš memoriji]] gde svako zapisivanje smanjuje životni vek memorije.
Minimizacija broja pisanja veoma je korisna kada je zapisivanje podataka skupo, npr na [[EEPROM]]-u ili [[Флеш меморија|fleš memoriji]] gde svako zapisivanje smanjuje životni vek memorije.


== Algoritam ==
== Algoritam ==
Ред 60: Ред 60:
</source>
</source>


==Specijalni slučejevi==
== Specijalni slučejevi ==
Kada niz sadrži samo ponovljene vrednosti iz relativno malog opsega brojeva, može se napraviti savršena [[Хеш_табела|heš funkcija]] [[Константно_време|konstantnog vremena]] koja značajno ubrzava pronalaženje mesta na koje treba postaviti element, podižući efikasnost sa [[Велико_О|O]](-{n}-²) na [[Велико_О|O]](-{n+k}-) gde je -{k}- broj adresa heš tabele. Na kraju je niz sortiran po redosledu heširanja, pa je važno izabrati dobru heš funkciju koja će niz sortirati na potreban način.
Kada niz sadrži samo ponovljene vrednosti iz relativno malog opsega brojeva, može se napraviti savršena [[Хеш табела|heš funkcija]] [[Константно време|konstantnog vremena]] koja značajno ubrzava pronalaženje mesta na koje treba postaviti element, podižući efikasnost sa [[Велико О|O]](-{n}-²) na [[Велико О|O]](-{n+k}-) gde je -{k}- broj adresa heš tabele. Na kraju je niz sortiran po redosledu heširanja, pa je važno izabrati dobru heš funkciju koja će niz sortirati na potreban način.


Pre sortiranja treba napraviti [[histogram]], koji će beležiti broj pojavljivanja svakog heša u nizu. Zatim napraviti tabelu koja će sadržati kumulativne sume svakog ulaza histograma. Ta tabela će sadržati poziciju svakog elementa u nizu. Zatim se pravo mesto svakog elementa može pronaći heširanjem (u [[Константно_време|konstantnom vremenu]]) i pomoću tabele, umesto linearnom pretragom.
Pre sortiranja treba napraviti [[histogram]], koji će beležiti broj pojavljivanja svakog heša u nizu. Zatim napraviti tabelu koja će sadržati kumulativne sume svakog ulaza histograma. Ta tabela će sadržati poziciju svakog elementa u nizu. Zatim se pravo mesto svakog elementa može pronaći heširanjem (u [[Константно време|konstantnom vremenu]]) i pomoću tabele, umesto linearnom pretragom.


<!--== Reference ==
<!--== Reference ==
Ред 69: Ред 69:
-->
-->
== Literatura ==
== Literatura ==
* {{cite journal |
* {{cite journal
last=Musser |
| last=Musser
first=David |
| first=David
title=Introspective Sorting and Selection Algorithms |
| title=Introspective Sorting and Selection Algorithms
url=http://www.cs.rpi.edu/~musser/gp/introsort.ps |
| url=http://www.cs.rpi.edu/~musser/gp/introsort.ps
doi=10.1002/(SICI)1097-024X(199708)27:8<983::AID-SPE117>3.0.CO;2-# |
| doi=10.1002/(SICI)1097-024X(199708)27:8<983::AID-SPE117>3.0.CO;2-#
journal=Software: Practice and Experience |
| journal=Software: Practice and Experience
volume=27 |
| volume=27
issue=8 |
| issue=8
publisher=Wiley |
| publisher=Wiley
year=1997 |
| year=1997
pages=983–993}}
| pages=983–993}}
* -{Niklaus Wirth. "Algorithms and Data Structures". Prentice-Hall, Inc., 1985. ISBN 0-13-022005-1.}-
* -{Niklaus Wirth. "Algorithms and Data Structures". Prentice-Hall, Inc., 1985. ISBN 0-13-022005-1.}-



Верзија на датум 7. децембар 2013. у 05:00

Ciklično sortiranje
Namena sortiranje
Struktura podataka Niz
Vremenska kompl. O(n²)
Memorijska kompl. O(n)
Stabilan ne

Ciklično sortiranje predstavlja nestabilni, in-place algoritam za sortiranje, pripada grupi sortiranja poredjenjem i optimalan je u smislu ukupnog broja upisivanja u niz. Zasniva se na ideji da se permutacija koju treba sortirati može podeliti na cikluse. Zatim rotiramo cikluse da bi dobili sortiran niz. Vremenska složenost algoritma je O(n²).

Za razliku od skoro svakog drugog sortiranja, ovde se elementi nikada ne upisuju negde u nizu samo da bi bili sklonjeni sa puta. Svaka vrednost je upisana ili nula puta, ako je već na svom mestu, ili tačno jednom, na svoju poziciju. Ovim se postiže minimalan broj upisivanja za kompletno in-place sortiranje. Minimizacija broja pisanja veoma je korisna kada je zapisivanje podataka skupo, npr na EEPROM-u ili fleš memoriji gde svako zapisivanje smanjuje životni vek memorije.

Algoritam

Ovaj algoritam pronalazi cikluse i rotira ih, i na kraju daje sortiran rezultat. Napomena: Opseg (a,b) sadrži brojeve od a do b-1.

# Sort an array in place and return the number of writes.
def cycleSort(array):
  writes = 0
  
  # Loop through the array to find cycles to rotate.
  for cycleStart in range(0, len(array) - 1):
    item = array[cycleStart]
    
    # Find where to put the item.
    pos = cycleStart
    for i in range(cycleStart + 1, len(array)):
      if array[i] < item:
        pos += 1
    
    # If the item is already there, this is not a cycle.
    if pos == cycleStart:
      continue
    
    # Otherwise, put the item there or right after any duplicates.
    while item == array[pos]:
      pos += 1
    array[pos], item = item, array[pos]
    writes += 1
    
    # Rotate the rest of the cycle.
    while pos != cycleStart:
      
      # Find where to put the item.
      pos = cycleStart
      for i in range(cycleStart + 1, len(array)):
        if array[i] < item:
          pos += 1
      
      # Put the item there or right after any duplicates.
      while item == array[pos]:
        pos += 1
      array[pos], item = item, array[pos]
      writes += 1
  
  return writes

Specijalni slučejevi

Kada niz sadrži samo ponovljene vrednosti iz relativno malog opsega brojeva, može se napraviti savršena heš funkcija konstantnog vremena koja značajno ubrzava pronalaženje mesta na koje treba postaviti element, podižući efikasnost sa O(n²) na O(n+k) gde je k broj adresa heš tabele. Na kraju je niz sortiran po redosledu heširanja, pa je važno izabrati dobru heš funkciju koja će niz sortirati na potreban način.

Pre sortiranja treba napraviti histogram, koji će beležiti broj pojavljivanja svakog heša u nizu. Zatim napraviti tabelu koja će sadržati kumulativne sume svakog ulaza histograma. Ta tabela će sadržati poziciju svakog elementa u nizu. Zatim se pravo mesto svakog elementa može pronaći heširanjem (u konstantnom vremenu) i pomoću tabele, umesto linearnom pretragom.

Literatura

Spoljašnje veze