Problem rozwiązany. Prawdopodobnie istnieje lepsze rozwiązanie choćby poprzez zastosowanie sortowania szybkiego.
int* next(int y, int x, int n, int **A)
{
int *tab = new int[2];
if (!(y==n/2 && x== (n-1)/2)){
if (x>(n-1)/2)
{
if (y>=(n-1)-x && y < x){
tab[0] = y+1;
tab[1] = x;
return tab;
}
else{
if (y<=(n-1)/2){
tab[0] = y;
tab[1] = x+1;
return tab;
}
else{
tab[0] = y;
tab[1] = x-1;
return tab;
}
}
}
else
{
if (y<=(n-1)-x && y > x+1){
tab[0] = y-1;
tab[1] = x;
return tab;
}
else{
if (y<=(n-1)/2){
tab[0] = y;
tab[1] = x+1;
return tab;
}
else{
tab[0] = y;
tab[1] = x-1;
return tab;
}
}
}}
else
{
tab[0] = 0;
tab[1] = 0;
return tab;
}
}
void min(int y, int x, int n, int **A)
{
int *tab = new int[2];
int *min = new int[2];
tab[0] = y;
tab[1] = x;
min[0] = y;
min[1] = x;
for (int i = 0; i<n*n; i++){
tab = next(tab[0],tab[1],n,A);
if (tab[0] == 0 && tab[1] == 0)
break;
if (A[tab[0]][tab[1]] < A[min[0]][min[1]] ){
min = tab;}
}
int temp = A[y][x];
A[y][x] = A[min[0]][min[1]];
A[min[0]][min[1]] = temp;
}
void sort(int ** arr, int N){
int j = N-1;
for(int i=0; j >= 0; i++, j--){
for(int k = i ; k < j; k++){ min(i,k,N,arr); }
for(int k = i ; k < j; k++){ min(k, j, N, arr); }
for(int k = j ; k > i; k--){ min(j, k, N, arr); }
for(int k = j ; k > i; k--){ min(k, i, N, arr);}
}
}