[RISOLTO] Si può fare?

di il
7 risposte

[RISOLTO] Si può fare?

Scusate si può fare l'ordinamento di una matrice (C++) ? Ossia che con il primo elemento a[0][0] fosse il più piccolo e l'ultimo il più grande? come in un array unidimensionale.

Ad esempio:

A =
3 2 1
7 5 10
9 6 1

diventasse ==>

A =
1 1 2
3 5 6
9 7 10

Il codice l'ho scritto così ma non so se si può fare l'ordinamento:

#include <iostream>

using namespace std;

int main()
{
        int a[3][3] = {3,2,1,7,5,10,9,6,1};

        bool swapped = true;

                while(swapped)
                {
                        swapped = false;

                        for(int i = 0; i < 2; i++)
                        {
                                for(int j = 0; j < 2; j++)
                                {
                                        if(a[i][j] > a[i+1][j+1])
                                        {
                                                swap(a[i][j],a[i+1][j+1]);
                                                swapped = true;
                                        }
                                }
                        }
                }


cout <<"La matrice:\n";
                                                for(int i = 0; i < 3; i++)
                                                {
                                                        for(int j = 0; j < 3; j++)
                                                        {
                                                                cout << a[i][j] <<",";

                                                        }

                                                        cout <<"\n";

                                                }


return 0;
}


Ovviamente in codice non restituisce quello che voglio.

Output:


1,2,1,
6,3,10,
9,7,5,

Grazie delle eventuali risposte.

Ps: Ah un 'ultima domanda. Non è possibile copiare una matrice dentro un array unidimensionale vero?

7 Risposte

  • Re: [RISOLTO] Si può fare?

    Escher ha scritto:


    Ps: Ah un 'ultima domanda. Non è possibile copiare una matrice dentro un array unidimensionale vero?
    Forse è la cosa più semplice, prima ti copi la matrice (con un doppio for) dentro un array di dimensione opportuna, poi riordini l' array e poi riempi di nuovo la matrice.
  • Re: [RISOLTO] Si può fare?

    Prova questo
    
    #include <iostream>
    #include <algorithm>
    #include <iterator>
    
    int main()
    {
    	int a[3][3] = {{3,2,1},{7,5,10},{9,6,1}};
    	std::sort(&a[0][0],&a[0][0] + 9);
    	std::copy(&a[0][0],&a[0][0]+9,std::ostream_iterator<int>(std::cout, " "));
    	std::cout << std::endl;
    
    	//copiare un multiarray su un array monodimensionale
    	int b[9];
    	std::copy(&a[0][0],&a[0][0] + 9 ,b);
    	std::copy(b,b+9,std::ostream_iterator<int>(std::cout, " "));
    }
    
    Quante righe in meno ha il mio codice rispetto al tuo?
  • Re: [RISOLTO] Si può fare?

    Guarda allora avevo pensato a copiare la matrice dentro l'array della dimensione opportuna ma non devo usare "algorithm" nè "iterator" anche perchè non l'ho studiate e vorrei riuscirci senza usarle.

    Dopo aver copiato la matrice nell'array lo ordino.

    E' possibile fare ciò senza usare quelle due librerie?

    Grazie !
  • Re: [RISOLTO] Si può fare?

    Certo. Me prima devi dichiarare bene l'array. hai visto le parentesi grafe aggiunte? Cmq la copia si può fare così
    
    
    int main()
    {
    	int a[3][3] = {{3,2,1},{7,5,10},{9,6,1}};
    	int b[9];
    	int k = 0;
    	for(int i = 0; i < 3; i++)
    	{
    		for(int j = 0; j < 3; j++,k++)
    		{
    			b[k] = a[i][j];
    		}
    	}
    }
    
    oppure eliminando k
    
    
    int main()
    {
    	int a[3][3] = {{3,2,1},{7,5,10},{9,6,1}};
    	int b[9];
    	for(int i = 0; i < 3; i++)
    	{
    		for(int j = 0; j < 3; j++)
    		{
    			b[3*i + j] = a[i][j];
    		}
    	}
    }
    
  • Re: [RISOLTO] Si può fare?

    Ciao skynet scusa se mi intrometto,
    per la copia si potrebbe anche fare:
    
       int a[3][3] = {{3,2,1},{7,5,10},{9,6,1}};
       int b[9];
    
       memcpy(b, a, sizeof(b));
    
    Questo esempio assieme a quello che hai fatto prima:
    
     std::copy(&a[0][0],&a[0][0] + 9 ,b);
    
    serve a ricordare che in C gli array del tipo a[][] sono blocchi contigui di dati. (cosa che devo ammettere mi ero dimenticata ).
  • Re: [RISOLTO] Si può fare?

    Ma perché non effettuare l'ordinamento sulla matrice stessa, ad esempio con il qsort()? come dice barba59 una matrice[][] è allocata staticamente in memoria come un unico blocco contiguo. ad esempio:
    
    //funzione di callback che la qsort() utilizzerà per il criterio di ordinamento
    int compareInt(const void *A , const void *B){
        const int *pA = (const int*)A;
        const int *pB = (const int*)B;
        if(*pA == *pB) return 0;
        else if (*pA > *pB) return 1;    
    else return -1;
    }
    
    void printMat(const int *mat , int w , int h){    
        for(int i=0 ; i<h ;i++){
            for(int j=0;j<w;j++)
                cout<< mat[j+(i*w)] <<" ";
            cout<<endl;
        }
    }
    
    void populateMat(int *mat , int w , int h,int range){    
        for(int i= (w*h)-1;i>=0;i--)
            mat[i]=rand() %range;
    }
    
    #define W 5
    #define H 5
    
    int main(){
        int mat[H][W];
        populateMat((int*)mat,W,H,100); //inserisce numeri da 0 a 99 nella matrice;
        cout<<"\nMatrice non ordinata:\n";
        printMat((const int*)mat,W,H);
        //ordinamento con qsort()
        qsort((void*)mat, W*H,sizeof(int),compareInt);
        //stampa matrice ordinata;
        cout<<"\nMatrice ordinata:\n";
        printMat((const int*)mat,W,H);
        return 0;
    }
    
    In questo modo si evita di creare un ulteriore array e quindi si risparmia memoria ed operazioni.
  • Re: [RISOLTO] Si può fare?

    Grazie a tutti, all'inizio volevo copiare la matrice in un array tanto gli elementi sono memorizzati in blocchi contigui nella ram, poi invece pensavo di ordinare direttamente la matrice ma conoscono solo il bubblesort come algoritmo per ordinamento, facendolo non funzionava (sbaglio qualcosa). Ora provo a vedere e vi faccio sapere.

    Grazie ancora a tutti !

    Ps: le doppie parentesi per l'array "A" a che servono?
    Pps: pensavo che la copia da matrice ad array non si potesse fare in quanto la matrice ha 2 dimensione mentre l'array una sola.
Devi accedere o registrarti per scrivere nel forum
7 risposte