Отлично - Ваш swap умеет переставлять числа!
// swap
{ int mem = a[i][1];
a[i][1] = a[n-i-1][1]; // мы знаем, что массивы в С нумеруются с 0?
a[n-i-1][1] = mem;
}
Теперь напишем то же самое для перестановки столбцов:
(т.е. мы знаем, как можно организовать матрицы в С:
как массив указетелей (а указатель=массив, если он указывает на кусок памяти,
содержащей элементы одинакового типа, записанные в ней без промежутков -
друг за другом), и указетели, как любые элементы с одинаковым размером можно
переставлять внутри массива). Таким образом:
void swap_columns (int *(col1[]), int *(col2[]))
// можно писать (int **col1, int **col2)
// В функции нам нужен указатель на указатель, чтобы вернуть изменения
{ int *temp_column = *col1;
*col1 = *col2;
*col2 = temp_column;
} // ** - это, наверно, непонятно, но это правильно.
int main (void)
{ int i=0, j=0;
// ...
int matrix[][]; // или int **matrix; - указатели,
// на которые malloc-ом надо навесить память, если вы проходили
// динамическое распределенение памяти:
// В нашем случае, надо вызвать первый malloc для массива столбцов,
// размера (int*) * columns_count
// и в цикле для каждого массива-столбца, размера int*rows_count
// ...
// А это - "сортировка пузырьком" для столбцов по первому значению
for (i=0; i<columns_count; ++i)
for (j=i+1; j<columns_count; ++j)
if( matrix[i][0] > matrix[j][0] )
swap_columns (&matrix[i], &matrix[i+1]);
// ...
return 0;
}