メイン関数は配列の中身を出力するだけで書くと冗長になってしまうと思うので、ソート用の関数だけを下に書きます。アルゴリズムに強い方、助けてください。以下の結果は無限ループでした。
void quick(int data[MAX][MAX],int first_x,int first_y,int last_x, int last_y){
int i,j,k,l;
int temp;
int x;
x = data[(first_x+last_x)/2][(first_y+last_y)/2];
i=first_x; j=first_y; k=last_x; l=last_y;
for(;;){
while(data[i][j] < x){
/*xより大きな値が見つかるまで
インデックスを左から右に一つ進める。ただし、行替えが起きるとき
jを0にし、iを進める。*/
j++;
if(j>MAX-1){
j=0; i++;
}
}
while(data[k][l] > x){
/*xより小さな値が見つかるまで
右側のインデックスを一つ左側に進める。上と逆の動作をさせる*/
l--;
if(l<0){
l=MAX-1; k--;
}
}
/*左側のインデックスが右側より大きくなったらループから抜ける*/
if((i*MAX+j) >= (k*MAX+l)) break;
/*左側と右側を入れ替える*/
temp=data[i][j]; data[i][j]=data[k][l];data[k][l]=temp;
}
/*超えちゃった分を元に戻す*/
j--;
if(j<0){
j=MAX-1; i--;
}
l++;
if(l>MAX-1){
l=0;k++;
}
/*再帰部分*/
if((first_x*MAX+first_y) <(i*MAX+j))
quick(data,first_x,first_y,i,j);
if((k*MAX+l) < (last_x*MAX+last_y))
quick(data,k,l,last_X,last_y);
}