实在不觉得递归等方式有什么简单的地方,没错我就是用的最笨的方法模拟。
和我一样的小白看代码应该很容易理解。

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int N;
int main(){
    int m,n;scanf("%d",&N);
    int temp=sqrt(N),arr[N];
    for(int i=0;i<N;i++){//输入数据
        scanf("%d",&arr[i]);
    }
    sort(arr,arr+N);
    for(int i=temp;i>=0;i--){//求出hang数》lie数
        if(N%i==0){
            n=i;m=N/i;
            break;
        }
    }
    N--;
    int put[m][n],left=0,right=n-1,up=0,down=m-1;
    while(N>=0){
        for(int i=left;i<=right;i++)
            put[up][i]=arr[N--];
        if(left<=right)up++;
        if(N<0) break;
        for(int i=up;i<=down;i++)
            put[i][right]=arr[N--];
        if(N<0) break;
        if(up<=down)right--;
        for(int i=right;i>=left;i--)
            put[down][i]=arr[N--];
        if(N<0) break;
        if(right>=left)down--;
        for(int i=down;i>=up;i--)
            put[i][left]=arr[N--];
        if(N<0) break;
        if(down>=up)left++;
    }
    for(int i=0;i<m;i++){
        if(i!=0) printf("\n");
        for(int j=0;j<n;j++){
            if(j!=0) printf(" ");
            printf("%d",put[i][j]);
        }
    }
    getchar();
    return  0;
}