Per antragorn:
io ho provato, e quell'algoritmo funziona
naturalmente ho dovuto costruirci intorno un main minimale
eccolo:
#include <stdio.h>
#include <stdlib.h>
#define r 3
#define c 4
int mat[r][c];
void stampa(int * matrice, int righe, int colonne)
{
for(int i = 0; i < righe; i++)
{
printf("riga %d -> ", i);
for(int j = 0; j < colonne; j++)
{
printf("%2d ", * (matrice + i * colonne + j));
}
printf("\n");
}
}
int main(int argc, char ** argv)
{
for(int i = 0; i < r; i++)
{
for(int j = 0; j < c; j++)
{
mat[i][j] = random() % 99;
}
}
stampa((int *)mat, r, c);
int temp;
int s = 0;
for(int i = 0; i < r - 1; i++)
{
for(int j = i + 1; j < r; j++)
{
if(mat[i][c - 1] > mat[i + 1][c - 1])
{
while(s < c)
{
temp = mat[i][c - 1 - s];
mat[i][c - 1 - s] = mat[i + 1][c - 1 - s];
mat[i + 1][c - 1 - s] = temp;
s++;
}
s = 0;
}
}
}
stampa((int *)mat, r, c);
}
notrai che per non entrare troppo nei dettagli per la stampa sono passato per puntatori, per evitare di "star troppo a pensare"
un consiglio per lo OP
in futuro, non mettere spezzoni di programma che non compilano da soli, ammenocche non siano proprio cortissimi
mi hai costetto a costruire un main apposta per collaudare il tuo programma, questa volta va bene ma in futuro non lo farò più
fatto per fatto ormai posto la mia versione
completamente parametrica, che può ordinare per qualsiasi colonna, una matrice con qualsiasi numero di righe e qualsiasi numero di colonne
#include <stdio.h>
#include <stdlib.h>
#define RIGHE 5
#define COLONNE 5
void ordinamatrice(int * matrix, int r, int c, int colonna)
{
// ordina una matrice in ordine strettamente crescente
// analizzando la colonna indicata in 4° parametro
// occhio, nessun controllo di correttezza dell'input
int temp = 0;
int scambio = 0;
do
{
scambio = 0;
for(int i = 0; i < r - 1 ; i++)
{
if(*(matrix + i * c + colonna) > * (matrix + (i + 1)*c + colonna))
{
scambio = 1;
for(int k = 0; k < c; k++)
{
temp = * (matrix + i * c + k);
*(matrix + i * c + k) = *(matrix + (i + 1) * c + k);
*(matrix + (i + 1)*c + k) = temp;
}
}
}
}
while(scambio);
}
void stampamatrice(int * matrix, int r, int c)
{
for(int i = 0; i < r; i++)
{
printf("\n");
for(int j = 0; j < c; j++)
{
printf(" %2d ", *(matrix + i * c + j));
}
}
}
int main(int argc, char ** argv)
{
int * matrice = malloc(sizeof(int) * RIGHE * COLONNE);
for(int i = 0 ; i < RIGHE * COLONNE; i++)
{
*(matrice + i) = random() % 99;
}
printf("Matrice originale:\n");
stampamatrice(matrice, RIGHE, COLONNE);
printf("\n\n");
for(int i = 0; i < COLONNE; i++)
{
ordinamatrice(matrice, RIGHE, COLONNE, i);
printf("Matrice ordinata secondo colonna %d\n", i);
stampamatrice(matrice, RIGHE, COLONNE);
printf("\n\n");
}
printf("programma terminato\n");
}
ho usato pesantamente i puntatori, per poter usare matrici di ogni dimensione
nella main ho usato una malloc per creare la matrice, e una serie di random per popolarla
ma potete usare anche matrici statiche, provare per credere