Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ordinamento con le Matrici
Forum - C/C++ - Ordinamento con le Matrici

Avatar
Serge (Ex-Member)
Newbie


Messaggi: 12
Iscritto: 07/02/2008

Segnala al moderatore
Postato alle 16:42
Giovedì, 23/10/2008
Salve a tutti!!
Avendo una matrice come questa:

3 5 1
7 3 0
9 5 1

vorrei ordinarla per colonne, per ottenere questa:

3 3 0
7 5 1
9 5 1


Potete aiutarmi? Non so da dove cominciareee!! Grazie a tutti^^


"640K dovrebbero bastare a chiunque" - Bill Gates
PM Quote
Avatar
eddiewrc (Member)
Expert


Messaggi: 560
Iscritto: 30/04/2006

Segnala al moderatore
Postato alle 19:25
Giovedì, 23/10/2008
allora... la matrice è un vettore di vettori, che chiameremo M[COLONNE][RIGHE]

la cosa è molto semplice: devi scrivere una funzione di ordinamento, possibilmente prendendo qualche algoritmo già esistente ed efficiente (la fantasia è una bella cosa ma a volte è meglio usare quella degli altri!! ):rotfl:

quicksort è uno degli algoritmi più veloci, counting sort o radix sort sono più efficienti ma hanno delle restrizioni, vedi tu cosa fare. (se la matrice è non è molto grande basta acneh un semplice insertion sort)

dopodiche
con il ciclo

for (i = 0; i < COLONNE; i++)
    quicksort(M[ i ]);

verrà passata alla funzione quicksort (di ordinamento) ogni colonna

ovviamente devi stare attendo a com inserisci i dati nel vettore, xche se no ordini le righe al posto delle colonne, ma fai una semplice prova e vedi!

Ultima modifica effettuata da eddiewrc il 24/10/2008 alle 23:56


La conoscenza non ha mai fatto del male a nessuno. Caso mai hanno fatto del male quelli che hanno impiegato MALE la loro conoscenza. La conoscenza deve essere libera e quando dico libera intendo "free as freedom" e non "free as a free beer".
PM Quote
Avatar
gioser (Normal User)
Pro


Messaggi: 111
Iscritto: 03/10/2008

Segnala al moderatore
Postato alle 21:37
Giovedì, 23/10/2008
la cosa migliore è sfruttare le funzioni di libreria già scritte.
La qsort è una funzione dichiarata in <stdlib.h>

il problema è che si vuole l'ordinamento per colonne, per questo occorre trasporre la matrice prima di effettuare gli ordinamenti.

ecco una possibile implementazione. Semplificata al massimo.
Ovviamente per trattare matrici di dimensioni superiori (diverse) occorre parametrizzare ulteriormente le funzioni :)

e come documentazione della funzione di sort utilizzata:
http://www.cplusplus.com/reference/clibrary/cstdlib/qsort. ...

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int comparainteri(const void * a, const void * b)
  5. {
  6.         return (*(int *)a - *(int *)b);
  7. }
  8.  
  9. void trasponi(int x[3][3])
  10. {
  11.         int i, j;
  12.         for (i = 0; i < 3; ++i)
  13.                 for (j = 0; j < i; ++j)
  14.                 {
  15.                         int temp = x[i][j];
  16.                         x[i][j] = x[j][i];
  17.                         x[j][i] = temp;
  18.                 }
  19. }
  20.  
  21. void stampa(int x[3][3])
  22. {
  23.         int i, j;
  24.         for (i = 0; i < 3; ++i)
  25.         {
  26.                 for (j = 0; j < 3; ++j)
  27.                         printf("%d ", x[i][j]);
  28.                 printf("\n");
  29.         }
  30. }
  31.  
  32. int main()
  33. {
  34.         int i;
  35.         int m[3][3] = {{3, 5, 1}, {7, 3, 0}, {9, 5, 1}};
  36.        
  37.         stampa(m);
  38.         trasponi(m);
  39.         stampa(m);
  40.         for (i = 0; i < 3; ++i)
  41.                 qsort(&m[i][0], 3, sizeof(int), comparainteri);
  42.         trasponi(m);
  43.         stampa(m);
  44.         return 0;
  45. }



ciao :)

PM Quote