Discussione:
ordinamento dati in un array
(troppo vecchio per rispondere)
toni64
2009-11-17 17:57:44 UTC
Permalink
buongiorno !
operando in VBA mi sono trovato a dover ordinare dei dati contenuti in un
array monodimensionale

Finora ho risolto il problema a livello di programmazione :
- creo un array che contiene i puntatori
- cerco il valore massimo, attribuisco la posizione di questo valore massimo
all array puntatore in posizione 1
- cerco un valore appena sotto al massimo (inferiore al massimo e superiore
al dato precedente), e attribuisco la posizione di questo valore all array
puntatore in posizione 2
...
e vado avanti cosi fino a quanod non ho finito i dati nell array principale

Il lavoro è facile con pochi dati, diventa piu lungo lavorando su molti
dati.
Esiste un modo piu veloce , usando qualche funzione incorporata in Excel Vba
per fare cio ?

Avevo pensato ad un ulteriore trucco :
scrivo l array sullo spreadsheet
evidenzio il campo, applico sul foglio la funzione Ordina
ricarico sull array i nuovi dati ordinati

pero' mi interessava scoprire di piu degli ordinamenti!
grazie
Toni
Scossa
2009-11-17 19:18:17 UTC
Permalink
Post by toni64
pero' mi interessava scoprire di piu degli ordinamenti!
Puoi cominciare da qui:

http://groups.google.it/group/microsoft.public.it.office.excel/browse_frm/thread/1f206c7caf47f772/437811a1e32597f2

Bye!
Scossa
toni64
2009-11-17 20:32:40 UTC
Permalink
Post by Scossa
http://groups.google.it/group/microsoft.public.it.office.excel/browse_frm/thread/1f206c7caf47f772/437811a1e32597f2
Bye!
Scossa
grazie Scossa!
plinius
2009-11-17 20:27:28 UTC
Permalink
Post by toni64
buongiorno !
operando in VBA mi sono trovato a dover ordinare dei dati contenuti in un
array monodimensionale
- creo un array che contiene i puntatori
- cerco il valore massimo, attribuisco la posizione di questo valore
massimo all array puntatore in posizione 1
- cerco un valore appena sotto al massimo (inferiore al massimo e
superiore al dato precedente), e attribuisco la posizione di questo valore
all array puntatore in posizione 2
...
e vado avanti cosi fino a quanod non ho finito i dati nell array principale
Il lavoro è facile con pochi dati, diventa piu lungo lavorando su molti
dati.
Esiste un modo piu veloce , usando qualche funzione incorporata in Excel
Vba per fare cio ?
scrivo l array sullo spreadsheet
evidenzio il campo, applico sul foglio la funzione Ordina
ricarico sull array i nuovi dati ordinati
pero' mi interessava scoprire di piu degli ordinamenti!
grazie
Toni
La routine più veloce che io conosca (Francesco Balena):
***********************
Sub ShellSortAny(arr As Variant, numEls As Long, descending As Boolean)

Dim index As Long, index2 As Long, firstItem As Long

Dim distance As Long, value As Variant

' Esci se l'elemento non è un array.

If VarType(arr) < vbArray Then Exit Sub

firstItem = LBound(arr)

' Trova il valore migliore per la distanza.

Do

distance = distance * 3 + 1

Loop Until distance > numEls

' Ordina l'array.

Do

distance = distance \ 3

For index = distance + firstItem To numEls + firstItem - 1

value = arr(index)

index2 = index

Do While (arr(index2 - distance) > value) Xor descending

arr(index2) = arr(index2 - distance)

index2 = index2 - distance

If index2 - distance < firstItem Then Exit Do

Loop

arr(index2) = value

Next

Loop Until distance = 1

End Sub

***********************

Ciao,

E.
toni64
2009-11-17 20:35:59 UTC
Permalink
Post by plinius
***********************
Sub ShellSortAny(arr As Variant, numEls As Long, descending As Boolean)
è da studiare con attenzione, non è banalissima per le mie conoscenze di
programmazione
una sfida discreta x me :)
grazie !
r
2009-11-17 22:20:14 UTC
Permalink
Post by plinius
Post by toni64
buongiorno !
operando in VBA mi sono trovato a dover ordinare dei dati contenuti in un
array monodimensionale
- creo un array che contiene i puntatori
- cerco il valore massimo, attribuisco la posizione di questo valore
massimo all array puntatore in posizione 1
- cerco un valore appena sotto al massimo (inferiore al massimo e
superiore al dato precedente), e attribuisco la posizione di questo valore
all array puntatore in posizione 2
...
e vado avanti cosi fino a quanod non ho finito i dati nell array principale
Il lavoro è facile con pochi dati, diventa piu lungo lavorando su molti
dati.
Esiste un modo piu veloce , usando qualche funzione incorporata in Excel
Vba per fare cio ?
scrivo l array sullo spreadsheet
evidenzio il campo, applico sul foglio la funzione Ordina
ricarico sull array i nuovi dati ordinati
pero' mi interessava scoprire di piu degli ordinamenti!
grazie
Toni
***********************
Sub ShellSortAny(arr As Variant, numEls As Long, descending As Boolean)
Dim index As Long, index2 As Long, firstItem As Long
Dim distance As Long, value As Variant
' Esci se l'elemento non è un array.
If VarType(arr) < vbArray Then Exit Sub
firstItem = LBound(arr)
' Trova il valore migliore per la distanza.
Do
distance = distance * 3 + 1
Loop Until distance > numEls
' Ordina l'array.
Do
distance = distance \ 3
For index = distance + firstItem To numEls + firstItem - 1
value = arr(index)
index2 = index
Do While (arr(index2 - distance) > value) Xor descending
arr(index2) = arr(index2 - distance)
index2 = index2 - distance
If index2 - distance < firstItem Then Exit Do
Loop
arr(index2) = value
Next
Loop Until distance = 1
End Sub
***********************
Ciao,
E.- Nascondi testo citato
- Mostra testo citato -
non è la più veloce ... diciamo che si comporta bene sia con vettori
piccoli che grandi ... io difficilmente ho da ordinare vettori di
grandi dimensioni quindi uso quasi sempre un booble sort ... certo il
meno efficiente ma quello anche più facilmente adattabile ... è
sempre bene considerare dove come e quando usare uno piuttosto che un
altro algoritmo ... quindi la funzione shellsort di Balena forse è la
più adatta ... ordina valori numerici e stringhe ... concordo
quindi ... non conoscendo le esigenze di toni ...

aggiungo solo ...

http://excelvba.altervista.org/blog/index.php/Excel-VBA/Elenchi-univoci-funzioni-di-ordinamento-e-verifica-chiave.html

qui trovi anche un quicksort adattato da Maurizio Borrelli
saluti
r
Mauro Gamberini
2009-11-18 08:00:04 UTC
Permalink
Post by toni64
scrivo l array sullo spreadsheet
evidenzio il campo, applico sul foglio la funzione Ordina
ricarico sull array i nuovi dati ordinati
pero' mi interessava scoprire di piu degli ordinamenti!
In Excel, questo dovrebbe essere il metodo
più veloce se hai grandi quantità di dati.
Tutto sta a come *scarichi* e *ricarichi*
i dati dal/nell'array.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/officeit/threads
toni64
2009-11-18 15:44:58 UTC
Permalink
Post by Mauro Gamberini
In Excel, questo dovrebbe essere il metodo
più veloce se hai grandi quantità di dati.
Tutto sta a come *scarichi* e *ricarichi*
i dati dal/nell'array.
si , certo
fondamenatle non scrivere i dati 1x1 altrimenti non si finisce piu...
su quello sono abbastanza ferrato, per fortuna :)
grazie

Continua a leggere su narkive:
Loading...