Oppure

Loading
23/10/08 14:42
Serge
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^^
aaa
23/10/08 17:25
eddiewrc
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 24/10/08 21:56
aaa
23/10/08 19:37
gioser
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:
cplusplus.com/reference/clibrary/cstdlib/…

#include <stdio.h>
#include <stdlib.h>

int comparainteri(const void * a, const void * b)
{
	return (*(int *)a - *(int *)b);
}

void trasponi(int x[3][3])
{
	int i, j;
	for (i = 0; i < 3; ++i)
		for (j = 0; j < i; ++j)
		{
			int temp = x[i][j];
			x[i][j] = x[j][i];
			x[j][i] = temp;
		}
}

void stampa(int x[3][3])
{
	int i, j;
	for (i = 0; i < 3; ++i)
	{
		for (j = 0; j < 3; ++j)
			printf("%d ", x[i][j]);
		printf("\n");
	}
}

int main()
{
	int i;
	int m[3][3] = {{3, 5, 1}, {7, 3, 0}, {9, 5, 1}};
	
	stampa(m);
	trasponi(m);
	stampa(m);
	for (i = 0; i < 3; ++i)
		qsort(&m[i][0], 3, sizeof(int), comparainteri);
	trasponi(m);
	stampa(m);
	return 0;
}


ciao :)
aaa