[[File:Sammarinese ID card 2017 (front).jpg|thumb|upright=1.4|Carta d'identità sammarinese elettronica in uso dal 2017 {{simbolo|EPassport logo.svg}}]]
Un '''algoritmo di ordinamento''' ({{en}} ''sorting algorithm'') è un [[algoritmo]] che viene utilizzato per elencare gli elementi di un insieme secondo una sequenza stabilita da una [[relazione d'ordine]], in modo che ogni elemento sia minore (o maggiore) di quello che lo segue. In assenza di altre specifiche, la relazione d'ordine viene sempre considerata totale (cioè tale da rendere sempre possibile il confronto tra due elementi dell'insieme): le relazioni d'ordine parziale danno origine agli algoritmi di [[ordinamento topologico]]. A seconda del verso della relazione considerato, un ordinamento può essere ascendente o discendente.
[[File:Sammarinese ID card 2017 (back) 1.jpg|thumb|upright=1.4|Carta d'identità sammarinese (retro) non valida per l'espatrio.]]
[[File:Sammarinese ID card 2017 (back) 2.jpg|thumb|upright=1.4|Carta d'identità sammarinese (retro) valida per l'espatrio.]]
La '''carta d'identità sammarinese''' è un documento di riconoscimento della [[Repubblica di San Marino]], dal gennaio [[2017]] è in uso la [[carta d'identità elettronica]].
== Storia ==
== Criteri di partizionamento ==
Il rilascio della carta d'identità sammarinese venne disciplinato solo con la legge 20 gennaio [[1963]], n.3, la legge prevedeva che le carte d'identità non dovevano essere più rilasciate dalla [[Corpo della gendarmeria della Repubblica di San Marino|Gendarmeria]] ma dalla Direzione di Servizi di Stato Civile e quelle ancora presenti dovevano essere sostituite entro l'anno; la carta d'identità aveva un valore di tre anni per i sammarinesi e di un anno per i cittadini stranieri residenti<ref>[http://www.consigliograndeegenerale.sm/on-line/home/archivio-leggi-decreti-e-regolamenti/scheda17011081.html Legge 20 gennaio 1963, n.3]</ref>.
La legge 25 gennaio [[1990]], n. 12 la carta d'identità viene rilasciata anche agli stranieri residenti che hanno compiuto quattordici anni e viene istituito uno schedario presso la sede della Gendarmeria e la durata della carta d'identità passa a cinque anni<ref>[http://www.consigliograndeegenerale.sm/on-line/home/archivio-leggi-decreti-e-regolamenti/scheda17013561.html Legge 25 gennaio 1990, n. 12]</ref>.
Con la legge 17 giugno [[2004]] n.83 i dati dello schedario vengono immessi nel database informatico dell'Ufficio di Stato Civile e trasmessi alla Gendarmeria<ref>[http://www.consigliograndeegenerale.sm/on-line/home/archivio-leggi-decreti-e-regolamenti/scheda17015611.html Legge 17 giugno 2004, n.83]</ref>
Il Decreto Delegato 16 agosto [[2016]], n.105 prevede il rilascio della [[Carta d'identità elettronica]] (CIE) per tutti i cittadini sammarinesi e per quelli stranieri residenti in Repubblica, la firma non è richiesta per i minori di 12 anni e il documento ha una validità di cinque anni e di tre anni per i minori di sei anni d'età<ref>[http://www.consigliograndeegenerale.sm/on-line/home/archivio-leggi-decreti-e-regolamenti/scheda17149910.html Decreto Delegato 16 agosto 2016 n.105 - Disposizioni relative alle caratteristiche e al rilascio della carta d’identità munita di microprocessore]</ref>, il Decreto viene ratificato il 18 gennaio [[2017]]<ref>[http://www.consigliograndeegenerale.sm/on-line/home/archivio-leggi-decreti-e-regolamenti/scheda17151877.html Decreto Delegato 18 gennaio 2017 n.8 - Ratifica Decreto Delegato 16 agosto 2016 n.105 - Disposizioni relative alle caratteristiche e al rilascio della carta d’identità munita di microprocessore]</ref>.
== Caratteristiche ==
Per analizzare e studiare gli algoritmi di ordinamento sono stati definiti differenti criteri di partizionamento, analizzati qui di seguito.
La nuova carta d'identità sammarinese è elettronica e [[Sistema di riconoscimento biometrico|biometrica]]. È di plastica e ha il formato di una [[carta di credito]]. Nella parte frontale si trova l'immagine digitale che si replica anche lateralmente e i dati sono espressi in [[lingua italiana|italiano]] e [[lingua inglese|inglese]]: cognome, nome, nazionalità, luogo e data di nascita, data di rilascio e scadenza, il numero della carta, il sesso, il numero di carta e il numero personale. Nel retro è presente anche una microstampa olografica.
== Come ottenerla ==
=== Ordinamento interno e ordinamento esterno ===
Bisogna recarsi con la carta d'identità scaduta o con un documento di riconoscimento presso l'Ufficio di Stato Civile - Servizi Demografici ed Elettorali di [[Borgo Maggiore]] e pagare 30 [[euro]], per i minori di 6 anni ha un costo di 15 euro.
== Carta d'identità come documento di viaggio ==
Se il file da ordinare, o la struttura dati, può essere contenuto in memoria, il metodo viene detto interno. L'ordinamento di file residenti su disco o su nastro viene chiamato ordinamento esterno: la differenza principale tra i due tipi di ordinamento sta nel fatto che mentre nel primo è possibile accedere direttamente a un record, nel secondo i record devono essere indirizzati in modo sequenziale o al più per grandi blocchi.
Paesi dove è possibile entrare mostrando solo la carta d'identità sammarinese<ref>[http://www.esteri.sm/on-line/home/affari-esteri/trattati-internazionali/convenzioni-bilaterali/accordi-bilaterali-con-altri-stati.html Trattati Internazionali - Accordi Bilaterali con altri Stati]</ref>:
* Paesi dell'[[Area Schengen]] (eccetto la Repubblica Ceca, l'Islanda, la Lettonia, la Svezia e l'Ungheria)
* {{ALB}}
* {{AND}} <ref>{{Cita web|url =https://andorraguides.com/visa/schengen/}}</ref>
* {{BIH}}
* {{HRV}}
* {{FRO}}
* {{Bandiera|FRA}} [[Francia d'oltremare]]
* {{KOS}}
* {{MDA}}
* {{MNE}}
* {{MSR}} (È possibile l’ingresso con qualsiasi prova di identità, ma per un massimo di 14 giorni)<ref>{{Cita web|url =http://visados.com/en/visa-for-Montserrat}}</ref>
* {{ROU}}
== Note==
=== Ordinamento per confronti-scambi e digitale ===
<references />
== Voci correlate ==
A seconda del tipo di operazione che viene effettuata, si hanno due differenti tipi di ordinamento. L'ordinamento che effettua confronti e scambi (<math>a \leq b : exch(a,b)</math>) e l'algoritmo digitale che accede all'informazione tramite un gruppo di bit alla volta.
* [[Passaporto sammarinese]]
==Collegamenti esterni==
=== Ordinamento adattivo ===
*[http://www.sanmarino.sm/on-line/home/articolo44010956.html Emissione nuova carta d'identità sul portale ufficiale della Repubblica di San Marino]
*[http://www.consilium.europa.eu/prado/IT/SMR-BO-02001/index.html Caratteristiche della carta d'identità sammarinese] sul sito del [[Consiglio dell'Unione europea]]
{{Portale|diritto|San Marino}}
Solitamente un algoritmo di ordinamento sfrutta operazioni di confronto e scambio. Se tali operazioni vengono svolte in modo indipendente dai dati di input l'algoritmo viene definito non adattivo. Mentre se un metodo di ordinamento esegue diverse sequenze di operazioni in funzione del risultato dei confronti si ha un algoritmo adattivo.
[[Categoria:Diritto amministrativo sammarinese]]
=== Stabilità di un algoritmo ===<!-- Referenziata da "Sort (Unix)" -->
[[Categoria:Carta d'identità|San Marino]]
Un metodo di ordinamento si dice stabile se preserva l'ordine relativo dei dati con chiavi uguali all'interno del file da ordinare. Ad esempio se si ordina per anno di corso una lista di studenti già ordinata alfabeticamente un metodo stabile produce una lista in cui gli alunni dello stesso anno sono ancora in ordine alfabetico mentre un ordinamento instabile probabilmente produrrà una lista senza più alcuna traccia del precedente ordinamento.
La stabilità può essere forzata aggiungendo prima dell'ordinamento un piccolo indice a ciascuna chiave o allungando in qualche altro modo le chiavi sulle quali operare, in modo da renderle univoche preservando l'informazione sulla posizione relativa degli elementi.
=== Algoritmi in place ===
Un algoritmo si dice [[Algoritmo in loco|algoritmo ''in place'']] quando non crea una copia dell'input per raggiungere l'obiettivo, l'ordinamento in questo caso. Pertanto un algoritmo in place risparmia memoria rispetto ad un algoritmo non in place. Si noti infatti che, malgrado le considerazioni fatte sulla complessità abbiano senso in generale, hanno una rilevanza decisiva sui grandi numeri. Allo stesso modo della proprietà di essere o meno in place.
== Relazioni d'ordine e chiavi ==
La relazione d'ordine che intercorre tra gli elementi dell'insieme può essere:
* quella naturale (se esiste) per l'insieme preso in considerazione (ad esempio la relazione di <= per sottoinsiemi dei numeri naturali)
* una relazione definita dalle necessità dell'applicazione.
È frequente il caso in cui l'algoritmo di ordinamento non opera direttamente sui dati di interesse, ma su un diverso insieme di dati che sono in collegamento biunivoco con quello dei dati di interesse: questo è detto l'insieme delle chiavi. Nel caso frequente in cui i dati sono costituiti da [[record (tipo di dato)|record]], le chiavi sono spesso costituite dalla combinazione di uno o più campi del record stesso (questo avviene regolarmente nei [[database|database relazionali]]). L'obiettivo dei metodi di ordinamento consiste nel riorganizzare i record in modo tale che le loro chiavi siano disposte secondo un ordine ben definito (di norma in ordine numerico o alfabetico). Le specifiche caratteristiche delle chiavi e dei record possono variare notevolmente da un'applicazione all'altra. La nozione astratta di ordinamento prescinde da tali caratteristiche.
== Complessità degli algoritmi di ordinamento ==
La ricerca e l'ottimizzazione di algoritmi di ordinamento è molto importante per alcuni ambiti [[Informatica|informatici]] e per queste classi di algoritmi sono stati dimostrati svariati teoremi che ne definiscono i limiti. Il più importante è il seguente:
:''Teorema:'' La [[complessità temporale]] di un qualsiasi algoritmo di ordinamento per confronto è pari a <math>\Omega(NlogN)</math>, dove ''N'' è il numero di elementi da ordinare.
Questo teorema fissa il limite inferiore di complessità per gli algoritmi che si basano sul paragone di coppie di chiavi (per confronto). Nulla è noto su altri algoritmi di ordinamento, nemmeno quali possano essere. Sono stati ipotizzati (ma non prodotti) algoritmi di ordinamento totalmente [[Meccanica quantistica|quantistico]], che potrebbero avere un più basso limite inferiore di complessità.
=== Dimostrazione ===
Si vuole dimostrare che in un algoritmo '''confronti e scambi''' la complessità è <math>\mathsf \Omega( n\log n)</math>. Data in input una sequenza <math>e_1, e_2, ... e_n</math> di n elementi, l'azione dell'algoritmo si può rappresentare come un albero binario, per ogni sequenza di ingresso ci sarà un cammino all'interno dell'albero, questo perché si ha una permutazione delle sequenze, infatti il numero di permutazioni possibili su n elementi sono <math>n!</math> combinazioni che corrispondono al numero di foglie dell'albero.
Date due permutazioni distinte esse identificano diversi cammini all'interno dell'albero. <math>n!</math> è il numero di foglie nell'albero di decisione dove n è il numero di elementi da ordinare. Date <math>n!</math> foglie ed essendo l'albero binario l'altezza dell'albero sarà:
<math>h(T) \leq \lceil \log_2 n! \rceil</math>
L'altezza dell'albero corrisponde al numero di confronti, elemento indicativo del tempo di esecuzione dell'algoritmo. Nel caso peggiore, ossia quando si arriva al fondo dell'albero, si avrà una complessità pari a <math>\geq \lceil log_2 n! \rceil </math>.
Per ultimare la dimostrazione si utilizza la [[formula di Stirling]] sull'approssimazione di <math>n!</math>.
numero di confronti <math> \geq (\frac{1}{2}\log_2 2\pi + \frac{1}{2} \log_2 n + n \log_2 n - n \log_2 e) \sim n \log_2 n </math>
che a livello asintotico corrisponde a <math>\mathsf \Omega( n\log n)</math>.
=== Albero di copertura ===
Ogni operazione dell'algoritmo di ordinamento può essere analizzata tramite un [[albero binario]] di copertura. Per ordinare una sequenza di n elementi bisognerà effettuare un numero di operazioni pari all'altezza minima di un albero binario con k foglie:
<math>h(T) \geq \lceil\log k\rceil</math>
== Elenco degli algoritmi di ordinamento ==
Vi sono varie classi di algoritmi di ordinamento, i più noti ed utilizzati sono gli algoritmi di ordinamento per confronto (''comparison sort algorithms''), ma esistono altre classi caratterizzate da un tempo di esecuzione nel caso peggiore inferiore a O(''n''log''n'').
Nella tabella seguente sono elencati alcuni algoritmi di ordinamento, riportandone la complessità al caso ''Migliore'', ''Medio'' e ''Peggiore'', la ''memoria aggiuntiva richiesta'', e la ''stabilità''. Si utilizzano due convenzioni nella tabella: gli algoritmi sono implementati su array di chiavi intere; la complessità computazionale degli algoritmi di ordinamento per confronti è derivante unicamente dal numero di confronti effettuati.
{|class="wikitable sortable"
!|Nome || Migliore || Medio || Peggiore || Memoria || Stabile || ''In place'' || Note
|- align="center"
|| [[Avl sort]]
|| —
|| —
|| —
|| —
|| —
|| —
|| —
|- align="center"
|| [[Bubble sort]]
|| O(''n'')
|| O(''n''<sup>2</sup>)
|| O(''n''<sup>2</sup>)
|| Θ(1)
|| Sì
|| Sì
|| Algoritmo per confronto tramite scambio di elementi
|- align="center"
|| [[B sort]]
|| —
|| —
|| —
|| —
|| —
|| —
|| —
|- align="center"
|| [[B-Tree sort]]
|| —
|| —
|| —
|| —
|| —
|| —
|| —
|- align="center"
|| [[B-Tree sort]]
|| —
|| —
|| —
|| —
|| —
|| —
|| —
|- align="center"
|| [[Bitonic sort]]
|| O(log<sup>2</sup>''n'')
|| O(log<sup>2</sup>''n'')
|| O(log<sup>2</sup>''n'')
|| O(''n''log<sup>2</sup>''n'')
|| —
|| —
|| A. parallelo non basato sul confronto
|- align="center"
|| [[Stupid sort|Bogosort]]
|| O(n)
|| O(''n''·''n''!)
|| ∞
|| Θ(1)
|| No
|| Sì
|| A. non basato sul confronto
|- align="center"
|| Btm
|| —
|| —
|| —
|| —
|| Sì
|| No
|| —
|- align="center"
|| [[Gnome sort]]
|| O(''n'')
|| O(''n''<sup>2</sup>)
|| O(''n''<sup>2</sup>)
|| Θ(1)
|| Si
|| Si
|| A. per confronto tramite scambi, miglioria di ''[[Insertion sort]]''
|- align="center"
|| [[Heap sort]]
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(''n''log''n'')
|| Θ(1)
|| No
|| Sì
|| A. per confronto tramite selezione, ottimale
|- align="center"
|| [[Insertion sort]]
|| O(''n'')
|| O(''n''+''d'')
|| O(''n''<sup>2</sup>)
|| Θ(1)
|| Sì
|| Sì
|| A. per confronto tramite inserimento
|- align="center"
|| [[Counting sort]]
|| O(''n''+''k'')
|| O(''n''+''k'')
|| O(''n''+''k'')
|| O(''k'')
|| Sì
|| No
|| A. non basato sul confronto. ''k''=''max(A)-min(A)+1'', dove ''A'' è l'array.
la versione in-place non è stabile, quella non in-place usa uno spazio O(n+k) ed è stabile.
|- align="center"
|| [[Intro sort]]
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(log''n'')
|| No
|| Si
|| A. per confronto ibrido, derivato da ''[[Heap sort]]'' e ''[[Quick sort]]''
|- align="center"
|| [[Jump sort]]
|| —
|| —
|| —
|| —
|| —
|| —
|| —
|- align="center"
|| [[Merge sort]]
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(''n'')
|| Sì
|| No
|| A. per confronto tramite unione di componenti, ottimale e facile da parallelizzare
|- align="center"
|| [[Ms sort]]
|| —
|| —
|| —
|| —
|| —
|| —
|| —
|- align="center"
|| [[Oet sort]]
|| —
|| —
|| —
|| —
|| —
|| —
|| —
|- align="center"
|| [[Patient sort]]
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(''n'')
|| Sì
|| No
|| A. per confronto tramite partizionamento e selezione, ottimale e facile da parallelizzare
|- align="center"
|| [[Partition sort]]
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(''n''<sup>2</sup>)
|| O(log ''n'')
|| No
|| —
|| —
|- align="center"
|| [[Plasel sort]]
|| —
|| —
|| —
|| —
|| —
|| —
|| —
|- align="center"
|| [[Quicksort]]
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(''n''<sup>2</sup>)
|| O(''n'')
|| No
|| Sì
|| A. per confronto tramite partizionamento. Le sue varianti possono: essere stabili, usare solo O(log''n'') di memoria (v. di Sedgewick), costare solo O(''n''log''n'') usando ''[[Quickselect]]'', usare più pivot, ecc.
|- align="center"
|| [[Radix sort]]
|| O(''n''·''k''/''s'')
|| O(''n''·''k''/''s'')
|| O(''n''·''k''/''s'')
|| O(''n'')
|| Sì
|| No
|| A. non basato sul confronto. ''k'' è il numero medio di cifre delle chiavi da ordinare
|- align="center"
|| [[Ripple sort]]
|| —
|| —
|| —
|| —
|| —
|| —
|| —
|- align="center"
|| [[Selection sort]]
|| O(''n''<sup>2</sup>)
|| O(''n''<sup>2</sup>)
|| O(''n''<sup>2</sup>)
|| Θ(1)
|| No
|| Sì
|| A. per confronto tramite selezione di elementi
|- align="center"
|| [[Several unique sort]]
|| —
|| —
|| —
|| —
|| —
|| —
|| —
|- align="center"
|| [[Shaker sort]]
|| O(''n'')
|| Varia
|| O(''n''<sup>2</sup>)
|| Θ(1)
|| Sì
|| Sì
|| A. per confronto tramite scambio di elementi, miglioria del ''[[Bubble sort]]''. Noto anche come ''[[Cocktail sort]]''
|- align="center"
|| [[Shear sort]]
|| —
|| —
|| O(''n''log''n'')
|| —
|| —
|| —
|| A. per confronto di array bidimensionali
|- align="center"
|| [[Shell sort]]
|| O(''n'')
|| O(''n<sup>1,5</sup>'') / O(''n''log<sup>2</sup>''n'')
|| O(''n''log<sup>2</sup>''n'')
|| Θ(1)
|| No
|| Sì
|| A. per confronto, la sua complessità dipende dalla sequenza di gap utilizzata.
|- align="center"
|| [[Simple sort]]
|| —
|| —
|| —
|| —
|| —
|| —
|- align="center"
|| [[Sleep sort]]
|| O(''n'')
|| —
|| O(''k'')
|| Θ(1)
|| Si
|| Si
|| A. non basato sul confronto. ''k'' è uguale a ''max(A)'', dove ''A'' è l'array. L'algoritmo necessità di un processo parallelo indipendente per ogni elemento dell'array.
|- align="center"
|| [[Smooth sort]]
|| O(''n'')
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(''n'')
|| —
|| —
|| A. per confronto tramite unione di componenti, miglioria dell'''[[Heap sort]]''
|- align="center"
|| [[Sunrise sort]]
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(''n''log''n'')
|| O(''n'')
|| No
|| —
|| —
|- align="center"
|| [[Trippel sort]]
|| —
|| —
|| O(''n''<sup>~ log(3)/log(1.5)</sup>)
|| —
|| No
|| Sì
|| A. per confronto tramite partizionamento, di tipo ricorsivo. Le sue varianti possono essere stabili
|}
== Collegamenti esterni e bibliografia ==
* {{en}} [[Donald Knuth|D. E. Knuth]], ''[[The Art of Computer Programming]], Volume 3: Sorting and Searching''.
* [http://epaperpress.com/sortsearchItalian/index.html Una breve guida] agli algoritmi di ordinamento e ricerca
* {{cita web|http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/algoen.htm|Spiegazione e analisi di molti algoritmi|lingua=en}}
* {{cita web|http://www.cs.oswego.edu/~mohammad/classes/csc241/samples/sort/Sort2-E.html|Applet Java che mostra graficamente il funzionamento di alcuni algoritmi|lingua=en}}
* {{cita web|http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/CourseHome/index.htm|Corso sugli algoritmi reso gratuitamente disponibile on line dal MIT. Varie lezioni trattano di algoritmi di ordinamento|lingua=en}}
* [h**p://www.massimop.eu/?page_id=103 Applet Java che mostra l'ordinamento di array con alcuni algoritmi diversi e varie modalità di esecuzione - OFFLINE]
* {{cita web|http://www.simplesoft.it/algoritmi-di-ordinamento-in-java.html|Una guida sugli algoritmi di ordinamento in java, con l'ausilio di un Applet che mostra graficamente l'ordinamento di un array}}
== Altri progetti ==
{{interprogetto|commons=Category:Sort algorithms}}
{{Ordinamento}}
{{portale|informatica}}
[[Categoria:Algoritmi di ordinamento| ]]
|