[RISOLTO] Ordinamento

di il
11 risposte

[RISOLTO] Ordinamento

Allora forse c'è un errore concettuale (C++);
Mi spiegate perchè non va bene?

Devo ordinare gli elementi di un array:
C = [2,11,6,5,9,2,3,4,11,7,5,];


                                        for(int i = 0; i < dim-1; i++)
                                        {
                                                if(c[i] > c[i+1])
                                                {
                                                       
                                                        temp = c[i+1];
                                                        c[i+1] = c[i];
                                                        c[i] = temp;

                                                }

                                        }

L'output è:

{ 2,6,5,9,2,3,4,11,7,5, }
Perchè? Eppure la variabile d'appoggio dovrebbe funzionare !

Poi ho provato a farlo in un altro modo:

bool swapped;  

                                       while(swapped)
                                        {
                                                swapped = false;
                                        
                                               for(int i = 0; i < dim-1; i++)
                                               {
                                                     if(c[i] > c[i+1])
                                                     {
                                                        swap(c[i],c[i+1]);
                                                        swapped = true;
                                               

                                                    }

                                             }
                                        }

L'output è:

{ 2,2,3,4,5,5,6,7,9,11, }
Manca il numero 11 non viene ripetuto ripetuto.

Cosa sbaglio? Grazie delle eventuali risposte.

11 Risposte

  • Re: [RISOLTO] Ordinamento

    Ciao Escher,
    Controlla bene che è giusto, ho provato il tuo codice e funziona, lo riscrivo:
    
    #include <stdio.h>
    #include <vector>
    using namespace std;
    
    int main()
    {
    	int c[] = {2,11,6,5,9,2,3,4,11,7,5};
    	int dim = sizeof(c) /sizeof(int);
    	bool swapped = true;  
    
    	while(swapped)
    	{
    		swapped = false;
    
    		for(int i = 0; i < dim-1; i++)
    		{
    			if(c[i] > c[i+1])
    			{
    				swap(c[i],c[i+1]);
    				swapped = true;
    			}
    		}
    	}
    
    	return 0;
    }
    
  • Re: [RISOLTO] Ordinamento

    Fatto si funziona, che scemo... grazie. =)

    Un'ultima domanda ma perchè con la variabile temp non funziona?
    Eppure è una swap anche quella no?

    Potreste spiegarmelo?

    Grazie delle eventuali risposte.
  • Re: [RISOLTO] Ordinamento

    C'è un errore di dimensione in questa funzione ma non riesco a capire quale potrebbe essere:

    Ecco:
    
    
    int erase(int c[dim], int d[dim])
    {
                    for(int i = 0; i < dim-1; i++)
                    {
                            if(c[i] == c[i+1])
                            {
                                    d[i] = c[i];
                            }
                    }
    
    
    cout <<"{ ";
                                    for(int i = 0; i < dim; i++)
                                    {
                                            cout << d[i] <<",";
    
                                    }
    cout <<" }\n";
    
    return 0;
    }
    
    // ECCO IL MAIN
    
    int main()
    {
            int a[dimA] = {2,11,6,5,9};
            int b[dimB] = {2,3,4,11,7,5};
            int c[dim],d[dim];
    
    
    copia(a,b,c);
    ordina(c);
    erase(c,d);
    
    return 0;
    }
    
    L'output è:
    
    D =
    { 2,134514976,0,-1074900216,5,-1218886908,134519644,-1074900184,134514891,11,134520116, }
    
    Dovrebbe invece stampare:
    
    D = {2,5,11};
    
    Grazie delle risposte !
  • Re: [RISOLTO] Ordinamento

    Se al posto della chiamata a swap metto uno swap fatto col 'temp' continua a funzionare:
    
    int main()
    {
    	int c[] = {2,11,6,5,9,2,3,4,11,7,5};
    	int dim = sizeof(c) /sizeof(int);
    	bool swapped = true;  
    
    	while(swapped)
    	{
    		swapped = false;
    
    		for(int i = 0; i < dim-1; i++)
    		{
    			if(c[i] > c[i+1])
    			{
    				//swap(c[i],c[i+1]);
    				int temp = c[i+1];
                    c[i+1] = c[i];
                    c[i] = temp;
    				swapped = true;
    			}
    		}
    	}
    
    	return 0;
    }
    
    Se invece ti riferisci al primo post che hai scritto semplicemente quello non è un algoritmo di ordinamento .
  • Re: [RISOLTO] Ordinamento

    Perchè non funziona il primo che ti ho postato?
    Ci voleva la variabile bool?
  • Re: [RISOLTO] Ordinamento

    Non funziona perchè il principio è sbagliato, fa una sola passata e scambia due elementi se il sucessivo è minore, semplicemente questa cosa non ordina un array.
  • Re: [RISOLTO] Ordinamento

    Ah si certo ora ho capito.
    Per il fatto invece della dimensione non saprei proprio ora lo riguardo un attimo.
    Lo riscrivo:
    
    int erase(int c[dim], int d[dim])
    {
                    for(int i = 0; i < dim-1; i++)
                    {
                            if(c[i] == c[i+1])
                            {
                                    d[i] = c[i];
                            }
                    }
    
    
    cout <<"{ ";
                                    for(int i = 0; i < dim; i++)
                                    {
                                            cout << d[i] <<",";
    
                                    }
    cout <<" }\n";
    
    return 0;
    }
    
    // ECCO IL MAIN
    
    int main()
    {
            int a[dimA] = {2,11,6,5,9};
            int b[dimB] = {2,3,4,11,7,5};
            int c[dim],d[dim];
    
    
    copia(a,b,c);
    ordina(c);
    erase(c,d);
    
    return 0;
    }
    
    
    E riscrivo anche l'output:
    
    D =
    { 2,134514976,0,-1074900216,5,-1218886908,134519644,-1074900184,134514891,11,134520116, }
    
    Quando dovrebbe essere:
    
    
    D = {2,5,11};
    
    
  • Re: [RISOLTO] Ordinamento

    Se scrivi tutto il codice in modo che lo possa eseguire posso darci un' occhiata, così non saprei che dirti.
  • Re: [RISOLTO] Ordinamento

    Certo scusami:
    http://pastebin.com/MqP2usy

    Grazie !
  • Re: [RISOLTO] Ordinamento

    - in 'ordina' la variabile swapped non è inizializzata, devi metterla a true. (errore grave ma che non c' entra niente).

    - la funzione 'erase' è sbagliata sia come nome che come contenuto, sarebbe meglio chiamarla 'copyDuplicates' in quanto il suo scopo è quello di mettere in 'd' gli elementi di 'c' che sono duplicati, inoltre il ciclo è sbagliato, devi tenere due indici 'i' e 'j' uno per l' array 'c' l' altro per 'd', inoltre una volta che hai trovato un duplicato devi saltare tutti quelli uguali (un numero potrebbe essere duplicato quattro o cinque volte ma deve essere inserito una sola volta).
    
    #include <iostream>
    
    using namespace std;
    
    const int dimA = 5;
    const int dimB = 6;
    const int dim = dimA+dimB;
    
    int copia(int a[dimA], int b[dimB], int c[dim])
    {
    	for(int i = 0; i < dimA ; i++)
    	{
    		c[i] = a[i];
    	}
    
    	for(int i = 0; i < dimB; i++)
    	{
    		c[i + dimA] = b[i];
    	}
    
    	return 0;
    }
    
    int ordina(int c[dim])
    {
    	bool swapped = true;
    
    	while(swapped)
    	{
    		swapped = false;
    
    		for(int i = 0; i < dim-1; i++)
    		{
    			if(c[i] > c[i+1])
    			{
    				swap(c[i],c[i+1]);
    				swapped = true;
    			}
    		}
    	}
    
    	return 0;
    }
    
    int copyDuplicates(int c[dim], int d[dim])
    {
    	cout <<"{ ";
    
    	int j = 0;
    	for(int i = 0; i < dim - 1; i++)
    	{
    		if (c[i] == c[i + 1])
    		{
    			d[j++] = c[i];  // copia se ripetuto
    			cout << c[i] <<",";
    	
    			while((i < dim - 1) && (c[i] == c[i + 1]))   // salta tutti quelli uguali
    				++i;
    		}
    	}
    
    	cout <<" }\n";
    	return j;
    }
    
    int main()
    {
    	int a[dimA] = {2,11,6,5,9};
    	int b[dimB] = {2,3,4,11,7,5};
    	int c[dim], d[dim];
    
    	copia(a,b,c);
    	ordina(c);
    	copyDuplicates(c,d);
    
    	return 0;
    }
    
  • Re: [RISOLTO] Ordinamento

    Perfetto grazie si avevo pensato a due variabili (i,j) ma credevo ne bastasse una (i). Non avevo pensato, invece, ad un numero che può ripetersi ad esempio 5 volte !

    Grazie mille ora funziona perfettamente.
Devi accedere o registrarti per scrivere nel forum
11 risposte