Qual è l'algoritmo per ordinare una matrice in ordine crescente?
Qual è l'algoritmo per ordinare una matrice in ordine crescente?
Lo stesso che scrivi per ordinare un array...
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
Un array si ordina così:Originariamente inviato da Scara95
Lo stesso che scrivi per ordinare un array...
Tuttavia una matrice non la riesco a ordinare nello stesso modo, ovvero:codice:for(j=0;j<n-1; j++) for(i=0; i<n-1; i++) if(a[i]<a[i+1]) {aux=a[i]; a[i]=a[i+1]; a[i+1]=aux;}
codice:for(k=0; k<righe-1; k++) for(i=0; i<righe-1; i++) for(j=0;j<colonne-1; j++) if(a[i][j]<a[i+1][j]) {aux=a[i][j]; a[i][j]=a[i+1][j]; a[+1][j]=aux;}
int array[N][M] è equivalente a int array[N*M]
array[i][k] è equivalente a array[i*M+k]
Sfruttando ciò potresti scrivere una cosa del tipo
int *indexer = (int *)array;
E usarlo come un array di N*M
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
L'idea è ottima e mi torna anche in teoria. Ora ho qualche problema con l'ordinamento. Me li ordina tutti tranne uno a caso che mi sostituisce con un numero incomprensibile. Ecco il codice dell'ordinamento. Ho già verificato con una printf e il trasferimento matrice-array è stato compiuto perfettamente.Originariamente inviato da Scara95
int array[N][M] è equivalente a int array[N*M]
array[i][k] è equivalente a array[i*M+k]
Sfruttando ciò potresti scrivere una cosa del tipo
int *indexer = (int *)array;
E usarlo come un array di N*M
Da notare inoltre che, se il numero di righe è uno ovvero un array semplice funziona senza problemi.codice:n= r*c; do { k = 0; for(i=0; i<n-1; i++) if(b[i]>b[i+1]) {aux=b[i]; b[i]=b[i+1]; b[i+1]=aux; k=1;} } while(k==1); for(i=0; i<n; i++) printf("Valore %d: %d\n", i, b[i]);
A controllarla ora non mi torna. Potresti mettermi il codice?Originariamente inviato da Scara95
int array[N][M] è equivalente a int array[N*M]
array[i][k] è equivalente a array[i*M+k]
Sfruttando ciò potresti scrivere una cosa del tipo
int *indexer = (int *)array;
E usarlo come un array di N*M
Scusami, ma ero impegnato e non ti ho potuto rispondere prima di adesso. Eccoti del codice di esempio, puoi studiarlo e modificarlo per capire meglio:codice:#include <stdio.h> #include <stdbool.h> #define N 5 #define M 3 int main(int argc, char **argv) { int j, k; int mat[N][M]; int *p_mat = (int *)mat; int tmp; bool change; //inserimento dati printf("Inserire una matrice di %ux%u elementi:\n", N, M); for(j = 0; j < N; j++) { for(k = 0; k < M; k++) { scanf("%d", &mat[j][k]); } } while(getchar() != '\n'); //pulisce il buffer dopo la lettura con scanf //stampa dati printf("\n\n"); for(j = 0; j < N; j++) { for(k = 0; k < M; k++) { printf("%d ", mat[j][k]); } printf("\n"); } //ordinamento dati for(j = N*M - 1, change = false; j > 0; j--) { for(k = 0; k < j; k++) { if(p_mat[k] > p_mat[k+1]) { tmp = p_mat[k]; p_mat[k] = p_mat[k+1]; p_mat[k+1] = tmp; change = true; } } if(!change) break; } //stampa dati printf("\n\n"); for(j = 0; j < N; j++) { for(k = 0; k < M; k++) { printf("%d ", mat[j][k]); } printf("\n"); } //alternativa di inserimento puramente dimostrativa printf("\n\n"); printf("Inserire una matrice di %ux%u elementi:\n", N, M); for(j = 0; j < N; j++) { for(k = 0; k < M; k++) { scanf("%d", &p_mat[j*M+k]); } } while(getchar() != '\n'); printf("\n\n"); for(j = 0; j < N; j++) { for(k = 0; k < M; k++) { printf("%d ", mat[j][k]); } printf("\n"); } for(j = N*M - 1, change = false; j > 0; j--) { for(k = 0; k < j; k++) { if(p_mat[k] > p_mat[k+1]) { tmp = p_mat[k]; p_mat[k] = p_mat[k+1]; p_mat[k+1] = tmp; change = true; } } if(!change) break; } printf("\n\n"); for(j = 0; j < N; j++) { for(k = 0; k < M; k++) { printf("%d ", mat[j][k]); } printf("\n"); } getchar(); return 0; }
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
ERRATA CORRIGE
codice:for(j = N*M - 1, change = false; j > 0; j--) { for(k = 0; k < j; k++) { if(p_mat[k] > p_mat[k+1]) { tmp = p_mat[k]; p_mat[k] = p_mat[k+1]; p_mat[k+1] = tmp; change = true; } } if(!change) break; }codice:for(j = N*M - 1, change = false; j > 0; j--) { change = false; for(k = 0; k < j; k++) { if(p_mat[k] > p_mat[k+1]) { tmp = p_mat[k]; p_mat[k] = p_mat[k+1]; p_mat[k+1] = tmp; change = true; } } if(!change) break; }
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares