Ordinamento Array con metodo DDA

di il
10 risposte

Ordinamento Array con metodo DDA

Buonasera a tutti,
Qualche giorno fa, mi è venuto in mente un modo per ordinare un "array" o chiamato anche "vettore" in un modo diverso dal "Selection sort" o "Bubble sort".
Ci ho pensato mentre a scuola mi spiegavano questi due metodi, ma visto che sto ancora imparando il C++, non so se è già stato inventato questo algoritmo, se fosse così sarò felice lo stesso di aver inventato una cosa già inventata .
Ho fatto vari test, l'algoritmo funziona alla perfezione, e mettendo un contatore nel while nidificato, ho calcolato quante operazioni (ovvero quante volte fa il ciclo di operazioni) impiega per ordinare un vettore di tot numeri, ho anche messo un timer che parte all'inizio dei while e si ferma alla fine, riportando il tempo. E mettendo a confronto i risultati, con un'algoritmo con l'ordinamento di un vettore con i metodi sopra citati, ovviamente utilizzando lo stesso vettore, si può vedere che il mio metodo impiega molto meno operazioni per ordinare il vettore, e impiega anche molto meno tempo.
Ecco a voi il codice :
#include <iostream>
#include <stdio.h>
#include <cstdlib>
using namespace std;
main ()
{int r=0;
do{
system("CLS");
cout<<"---BENVENUTO NEL PROGRAMMA DI ORDINAMENTO CON IL METODO DDA--"<<endl<<endl;
int n;
cout<<"Prego inserisci quanti numeri bisogna ordinare "<<endl;
cin>>n;
while(n<2){
if(n<2){cout<<"Dai sul serio pensi che questo programma sia cosi' stupido da impallarsi ordinando "<<n<<" numeri!?"<<endl<<"Rinserisci (in modo giusto) quanti numeri devi ordinare. "<<endl;
cin>>n;}}
int j=n-1, k=0, i=0, v[n], va=0, max=0, min=0;
int s;
max=j; min=k;
cout<<"Vuoi che i numeri vengano estratti causalmente dal Computer? (S=1/N=2)"<<endl;
cin>>s;

if(s==1)
{cout<<"Vuoi che il margine da rispettare per l'estrazione dei numeri sia casuale o che lo inserisci tu? (Casuale=1/Manuale=2)"<<endl<<"Da 0..................x"<<endl;
cin>>s;
if(s==2){
cout<<"Inserire x = "<<endl;
cin>>va;}else{va=rand()%9999999;
}

cout<<endl;
while(i<n){v[i]=rand()%va;
			i++;}
}else{
     
while(i<n){
           cout<<"Inserisci numero ";
           cin>>v[i];
           i++;
           }}
va=0;                    
i=0;
while(j>k){
           while(i<=j){
                      if(v[i]>v[max]){
                                      max=i;
                                      }else{
                                            if(v[i]<v[min]){
                                                            min=i;
                                                            }
                                                            
                                          
                                                                           
                                        }  
										 i++;
										
                                                                               
                      }
            if(max==k&&min==j){
            
        			va=v[j];
        			v[j]=v[k];
        			v[k]=va;
        			
        		}else{ if(min==j){
						 va=v[min];
            			v[min]=v[k];
            			v[k]=va;
						va=v[max];
            			v[max]=v[j];
            			v[j]=va;        
           			 }
           	else{
            	va=v[max];
            	v[max]=v[j];
            	v[j]=va;
            	va=v[min];
            	v[min]=v[k];
            	v[k]=va;
        		}
        		}
        	
            j--;
            k++;
            i=k;
            max=j;
            min=k;  
           }
i=0;
cout<<endl;
cout<<endl;
cout<<"Prima meta' di "<<n<<" numeri"<<endl<<endl;
if(n%2==0){while(i<n/2){cout<<v[i]<<endl;
						i++;}
			cout<<endl;
			cout<<endl;
			system("pause");
			cout<<endl;
			cout<<endl;
			cout<<"Seconda meta' di "<<n<<" numeri"<<endl<<endl;
					while(i<n){cout<<v[i]<<endl;												
								i++;
								}
			cout<<endl;
			cout<<endl;
			}else{
			n++;
			while(i<n/2){
								cout<<v[i]<<endl;												
								i++;
								}
						
cout<<endl;
cout<<endl;
system("pause");
cout<<endl;
cout<<endl;
cout<<"Seconda meta' di "<<n-1<<" numeri"<<endl<<endl;
while(i<n-1){cout<<v[i]<<endl;
							i++;
							}}

cout<<endl<<"Vuoi ricominciare o chiudere il programma?"<<endl<<"(Ricominciare=1/Chiudere=2) ";
cin>>r;
}while(r!=2);
}

10 Risposte

  • Re: Ordinamento Array con metodo DDA

    Confrontalo con questo
    #include <iostream>
    #include <algorithm>
    #include <time.h>
    #include <cstdlib>
    
    int main()
    {
        int v[1000];
        srand(time(NULL));
        for(int  i = 0; i < 1000; i++)
        {
           v[i] = rand() % 1000;
        }
        std::sort(v,v+1000);
    }
    Io vedo due while nidificati nel tuo algoritmo il che significa O(n^2) mentre il std::sort fa O(n*log(n)).
  • Re: Ordinamento Array con metodo DDA

    Premesso che non sono ancora molto esperto di c++, io avevo fatto il confronto con il mio metodo e il bubble e il selection sort, mettendo un contatore nel while nidificato, e facendo partire un timer prima che iniziata il while più estrerno, e che finisce quando finisce questo while.
    Ora, stavo pensando di fare lo stesso test con l'algoritmo che mi hai dato, ma mi da errore con il cout e il cin, poichè io volevo fare i test usando gli stessi numeri.
    E poi, seguendo ciò che hai detto, è meglio il mio poichè fa n^2 operazioni no?
  • Re: Ordinamento Array con metodo DDA

    Non stavo criticando il tuo algoritmo, stavo dicendo che se vuoi confrontarlo lo confronti con qualcosa di decente come lo std::sort. n^2 è peggio di nlog(n) (fa + operazioni).
    Se ti da errore cin e cout aggiungi
    using namespace std;
    dopo il blocco degli include.
    Il confronto lo fai con tanti numeri, 1000 sono pochi ma è un buon inizio.
  • Re: Ordinamento Array con metodo DDA

    Io non ho pensato affatto che tu mi stessi criticando, vengo in pace io
    Ora controllo.
    Per usare tanti numeri, ma uguali, basta che faccio il random senza azzerarlo vero?
  • Re: Ordinamento Array con metodo DDA

    Non so se ho fatto una cavolata io..Ma ho adattato il codice che mi hai dato, in modo da poter scegliere quanti numeri ordinare, e poi stamparli.
    Ma stampandoli, mi escono molti molti 0 e dopo tutti questi 0 escono numeroni che superano il limite di 1000 imposto da te nel random..
    Ti sei dimenticato di scrivere qualcosa, o sono io a non avere idea di come funzioni?
  • Re: Ordinamento Array con metodo DDA

    OK ho cambiato la versione lasciandoti la scelta del numero degli elementi. Vedi se ti funziona.
    #include <iostream>
    #include <algorithm>
    #include <time.h>
    #include <vector>
    #include <cstdlib>
    #include <iterator>
    
    int main()
    {	
    	srand(time(NULL));
    	std::cout << "Quanti numeri vuoi ordinare\t" << std::endl;
    	int n = 0;
    	std::cin >> n;
    	std::vector<int> v(n);
    	for(int  i = 0; i < n; i++)
    	{
    		v[i] = rand() % n;
    	}
    	std::sort(v.begin(),v.end());
    	std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout," "));
    	std::cin.get();
    }
  • Re: Ordinamento Array con metodo DDA

    Deligamte ha scritto:


    Buonasera a tutti,
    ...ho calcolato quante operazioni (ovvero quante volte fa il ciclo di operazioni) impiega per ordinare un vettore di tot numeri, ...
    Congratulazioni !
    Hai inventato una cosa gia' inventata ma estremamente importante: il concetto di

    la complessita' computazionale di un algoritmo

    Cioe': quante operazioni/quanto tempo impiega un algoritmo a risolvere un problema di dimensione N?

    La cosa non e' banale, ed il fatto di esserci arrivato e' degnmo di nota !
    Nel tuo caso il bubble sort ha una complessita computazionale di O(n^2)

    dove O(espressione) e' un simbolismo matematico per dire : si comporta piu' o meno come l'andamento della funzione 'espressione'.

    Sostituire un algoritmo O(n^2) con un'altro O(n^2) non e' molto utile, perche' se sembra funzionare meglio su numero piccoli (1000), con numero molto grandi praticamente non c'e' questa grande differenza (>1000.000 o mooooolto di piu').

    Per fare il salto di qualita' bisogna inventare un algoritmo con un andamento inferiore a O(n^2): ad esempio O(n) o addirittura O(1).

    Algoritmi del genere esistono!
  • Re: Ordinamento Array con metodo DDA

    Per Skynet:
    Mi funziona, ma non ho idea di come poter vedere quante operazioni fa per ordinarli, non essendo un ciclo..
    Ripeto, purtroppo sto ancora imparando il c++.

    Per migliorabile:
    Io non ho assolutamente detto di aver inventato il metodo per calcolare quante operazioni fa un algoritmo, io ho detto come l'ho calcolato io.
    Comunque se al mio algoritmo metto 20 N, casualmente, e metto un contatore dentro al while interno, mi calcola 110 operazioni.
    Mo non so se sono io ad aver sbagliato a calcolare le operazioni o altro, se fosse così, illuminatemi, che io non ho mai detto di essere un genio o esperto con questo linguaggio, quindi..Non c'è bisogno di prendere in giro
  • Re: Ordinamento Array con metodo DDA

    Attenzione, non era una presa in giro, era un bravo!
  • Re: Ordinamento Array con metodo DDA

    Allora mi scuso per il fraintendimento!
    Comunque discutendo con il mio professore oggi, ho capito che non fa meno operazioni, le fa più o meno uguali, ma ne fa molte insieme, quindi le operazioni sono simili, ma il tempo impiegato per ordinare un vettore è molto meno della metà di un algoritmo tipo selection o bubble.
    Vorrei sapere le vostre opinioni.
Devi accedere o registrarti per scrivere nel forum
10 risposte