void matrixsort(unsigned int *arr) {
int temp;
for (int i = 0; i < M - 1; i++) {
Здесь должно быть написано
for (int i = 0; i < N - 1; i++)
потому что это сортировка, а не обход матрицы.
while (line < N) {
for (int j = line; j < line + 1; j++) {
Это какая-то странная конструкция, из-за которой j доходит до N - 1, вызывая ошибку которую ты видишь. Вместо этого можно было выкинуть line вообще и написать просто
for (int j = 0; j < M; j++) {
arr0[M] = line;
Здесь ты портишь элемент матрицы заменяя его номером столбца. Отладка такая?