#include <stdio.h>
void spiral_find_min(int matrix[100][100],int i, int j, int m, int n, int lm, int ln, int order){
printf("%d %d %d %d\n",i,j,m,n);
int mini = i, minj = j;
int np=n/2+n%2;
printf("np %d order %d\n",np,order);
for (int k = 0;k<np;++k){
switch(order) {
case 1:
{
for (;j<m;++j){
if (matrix[mini][minj] > matrix[i][j]){
int tmp = matrix[mini][minj];
matrix[mini][minj]=matrix[i][j];
matrix[i][j]=tmp;
}
printf("1: %d %d\n",i,j);
}
++i;--j;
}
case 2:{
for (;i<n;++i){
if (matrix[mini][minj] > matrix[i][j]){
int tmp = matrix[mini][minj];
matrix[mini][minj]=matrix[i][j];
matrix[i][j]=tmp;
}
printf("2: %d %d\n",i,j);
}
--i;--j;
}
case 3:{
for (;j>=lm;--j){
if (matrix[mini][minj] > matrix[i][j]){
int tmp = matrix[mini][minj];
matrix[mini][minj]=matrix[i][j];
matrix[i][j]=tmp;
}
printf("3: %d %d\n",i,j);
}
--i;++j;
}
case 4:
for (;i>ln;--i){
if (matrix[mini][minj] > matrix[i][j]){
int tmp = matrix[mini][minj];
matrix[mini][minj]=matrix[i][j];
matrix[i][j]=tmp;
}
printf("4: %d %d\n",i,j);
}
}
++i;
++ln;++lm;--m;--n;
order = 1;
puts("-------");
}
}
void spiral_sort(int matrix[100][100],int m,int n){
int i=0,j=0;
int lm = 0,ln = 0;
int np = n/2+n%2;
int mm=m,nn=n;
for (int k = 0;k<np;++k){
for (;j<m;++j){
spiral_find_min(matrix,i,j,m,n,lm,ln,1);
}
for (++i,--j;i<n;++i){
spiral_find_min(matrix,i,j,m,n,lm,ln,2);
}
for (--i,--j;j>=lm;--j){
spiral_find_min(matrix,i,j,m,n,lm,ln,3);
}
for (--i,++j;i>ln;--i){
spiral_find_min(matrix,i,j,m,n,lm,ln,4);
}
++i;
++ln;++lm;--m;--n;
}
}
void print_matrix(int matrix[100][100],int m,int n){
for (int i=0; i<n; ++i){
for (int j=0;j<m;++j){
printf(" %d",matrix[i][j]);
}
puts("");
}
}
int main(void){
int matrix[100][100] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}};
spiral_sort(matrix,3,4);
print_matrix(matrix,3,4);
return 0;
}