View Single Post
Old 30-12-2011, 17:06   #5
djadry
Member
 
Iscritto dal: Dec 2009
Città: Varese
Messaggi: 274
Quote:
Originariamente inviato da demos88 Guarda i messaggi
Per ordinare un vettore puoi usare uno dei tanti algoritmi esistenti.
Ovviamente ognuno ha la sua complessità temporale che tipicamente varia tra O(n^2) e O(nLog(n)), esistono alcuni ordinamenti O(n) ma si possono usare solo in casi particolari. La complessità temporare da indicazione del tempo che impiega a ordinare: per ordinare 1000 valori un algoritmo O(n) impiega 1000 unità di tempo, un algoritmo O(n^2) impiega 1000000 unità di tempo. Lavorando con grandi quantitativi di dati questo si sente molto.

Un algoritmo molto semplice è quello descritto da tacchinox, che prevede la selezione del più basso dal vettore e la copia in un nuovo vettore, e ha complessità O(n^2).
Un altro algoritmo semplice potrebbe essere il selection sort, che non necessita di un altro vettore. Divide il vettore di partenza in una parte ordinata e una non ordinata e ad ogni ciclo sostituisce il primo valore della parte non ordinata con il valore più basso della stessa. Per esempio:
6 2 5 1 7 9 3
inizialmente tutto il vettore costituisce la parte non ordinata, la prima mossa è trovare il valore inferiore e metterlo al primo posto della sequenza non ordinata (inverto 1 con 6):
1 2 5 6 7 9 3
In verde è la sequenza ordinata. Ora cerco il minore tra i non ordinati: è 2 e si trova già al primo posto della parte non ordinata, quindi non faccio niente
1 2 5 6 7 9 3
Continuando trovo 3 e lo sostituisco con il 5
1 2 3 6 7 9 5
5 con il 6
1 2 3 5 7 9 6
e via dicendo...

Ci sono algoritmi ben più raffinati e prestanti ma richiedono più attenzione (merge sort, quicksort...) su wikipedia ne trovi molti, con anche del pseudocodice se vuoi implementarli http://it.wikipedia.org/wiki/Categor...di_ordinamento

ps: fai attenzione anche a quello che ha scritto Dan___88: è un errore comune copiare un valore al posto di uno già esistente senza tenersi una copia di quello che c'era prima (perdi il dato)
grazie a tutti.

senza andare troppo sul difficile, come posso implementare l'algoritmo descritto da te e tacchinox?

creo un nuovo array copia del precedente (già ordinato), ma per ordinarlo... un altro ciclo for come quello che avevo già fatto?
__________________
#FollowMe!
AMD Ryzen 1700X, ASUS Crosshair VI Hero, 32 GB DDR4 Corsair Vengeance 3200, NVidia GTX 960, Samsung 970 PRO, Phanteks Enthoo EVOLV ATX TG, LC EKWB custom loop e un po' di RGB...
djadry è offline   Rispondi citando il messaggio o parte di esso