上記の正確な質問の場合、解決策は次のようになります。
配列の左上隅と右下にある 2 つのポインターから始めます。これらの最初と 2 番目のポインターをそれぞれ呼び出します。最初のポインター行を使用して配列を反復処理します。最後に配置する要素 (この場合は「0」) を見つけたら、2 番目の要素が指す要素を確認します。2 番目の要素が 0 の場合、2 次元配列の最後の 2 番目の要素を指すように 2 番目のポインタをデクリメントします。これも '0' である場合は、この要素をチェックし、2 番目のポインターを再度デクリメントし、'1' (配列の先頭にある必要がある要素) に到達するまで繰り返します。次に、2 つの要素を交換します。ポインタが互いに交差している場合はいつでも、配列は要件に従ってソートされています。
次の Java コードはこれを行います。最初は、変数 endi と endj が最後の要素 (2 番目のポインター) を指し、変数 i と j が最初の要素 (最初のポインター) を指します。配列のサイズは m X n です。
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]==0)
{
while(a[endi][endj]!=1 && i*m+j<endi*m+endj) //second part of the condition checks if i,j and endi,endj haven't crossed over
{
endj--;
if(endj==-1)
{
endj=n-1;
endi--;
if(endi==-1)
{
disparr(a,m,n);
System.exit(0);
}
}
}
if(!(i*m+j<endi*m+endj))//if the pointer have crossed over
{
disparr(a,m,n);
System.exit(0);
}
int t=a[i][j];
a[i][j]=a[endi][endj];
a[endi][endj]=t;
}
}
}
上記のコードに対する他の改善が可能かもしれません。たとえば、関数へのポインターをデクリメントして呼び出すためのコードを削除するなどです。しかし、コードは問題なく動作します。