Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Ordinare 200.000 numeri

Caro NG,
  avrei un problema interessante: dovrei mettere in ordine 200.000 valori
(di tipo Long Double).
L'istanza del problema č molto grande.
Avevo pensato di utilizzare un mio algoritmo come il QuickSort per
effettuare l'ordinamento.
In Visual Basic č praticamente impossibile tenere in memoria tutti i valori,
quindi un'elaborazione in RAM non č proponibile.
Ho pensato alle seguenti soluzioni:
1) Database Access: mi creo un DB temporaneo, ci infilo i valori, invoco un
ordinamento, aspetto che finisca, uala!
2) Mi costruisco una struttura dati binaria su disco che rappresenta una
lista ed effettuo inserimenti ordinati, uala!
3) Mi creo una routine di servizio esterna in C++, uala!
4) Mi affido alla Beata Vergine, uala!
Non mi vengono in mente altre soluzioni.
Non ho ancora provato ad implementare una soluzione, attendo una vostra
risposta.
Ciao,
  Enrico.

L'istanza del problema è molto grande.
Il quicksort non è proponibile perchè andrebbe in stack overflow, però un
array di 200.000 numeri è fattibile, magari swapperà un po' ma alla fine
sarà la soluzione più rapida.
Se vuoi ti invio la mia procedura di sort, è piuttosto veloce anche senza
essere ricorsiva.
Comunque il consiglio (4) non è da escludere...
Ciao

 sarà la soluzione più rapida.
Hai ragione, ma esistono delle versioni di QuickSort non ricorsive (rimembri
di un vecchio esame
di Informatica...). Non mi chiedere come si scrivano, si usa una
rappresentazione che simula la ricorsione. Cmq...
Non sono convinto comunque che un ordinamento fatto dall'interno di Visual
Basic sia
la soluzione più rapida: io penso che la soluzione migliore sia il Database
Access.
Le routine interne per l'ordinamento in Access sono scritte in C e sono
molto più
ottimizzate di quanto possa ottimizzare io i miei algoritmi in Basic...
Si discuteva con un mio amico che lanciare l'ordinamento su un DB fatto in
Access è "asincrono" rispetto
all'esecuzione del programma in VB: lanci l'ordinamento, ti viene restituito
il controllo, Microsoft Jet fa il
resto senza bloccare la macchina (sarà vero ?).
Grazie cmq per la risposta.
  Enrico.
P.S. Zanna, per favore posta questa tua routine di ordinamento nell'NG,
cosi' ne possono giovare tutti. Al +, se non te la senti, postala a me. G R
A Z I E!
--> Mail to #enrico.tafuro#@
tin.it
  without #

cosi' ne possono giovare tutti. Al +, se non te la senti, postala a me.
Non posso postarla sul NG, sarebbe ingombrante, e poi non è altro che una
delle tante sub "copiate" dai libri.
Ciao

 quindi un'elaborazione in RAM non è proponibile.


...


 (di tipo Long Double).
Vorrei ringraziarvi tutti per aver partecipato in modo cosi' costruttivo
alla discussione.
Penso di essere giunto ad una soluzione che si adatta bene al mio problema
iniziale.
Ho provato ad inserire 500.000 valori in un DB Access.
Ho creato un Recordset usando la Query: "SELECT * FROM Valori ORDER BY
ValoreX, ValoreY;"
Per creare il Recordset ci ha impiegato un minutino, poi con una routine
idiota ho estratto tutti i valori del Recordset (che ovviamente sono già
ordinati). La procedura di estrazione era immediata, i valori era già
ordinati e pronti all'estrazione.
Un minuto per 500.000 valori Long Double mi sembra un compromesso
ragionevole... 8^)
Devo ammettere di avere un computer che molti miei amici definiscono da
"Turbominchia", Athlon 600, HDD su catena Ultra SCSI, etc.
Io dichiarerei il caso chiuso, ma lascerei la discussione aperta. I problemi
di ottimizzazione legati a Visual Basic possono essere un ottimo tavolo di
discussione.
Ciao a tutti e grazie ancora,
   Enrico.

resto senza bloccare la macchina (sarà vero ?).
Ho letto la stessa cosa mesi fa e ho testato che e' vero. conviene
creare una tabella in access e poi far procedere questa
all'ordinamento e' molto + rapido
Ciao Daniele