对于上面的确切问题,解决方案可以是:
从两个指针开始,一个在数组的左上角,一个在右下角。让我们分别调用这些第一个和第二个指针。现在使用第一个指针逐行遍历数组。当您找到要放在末尾的元素(在这种情况下为“0”)时,请检查第二个元素指向的元素。如果第二个元素是 0,则递减第二个指针以指向二维数组中的倒数第二个元素。现在检查这个元素,如果这也是“0”,再次递减第二个指针,依此类推,直到达到“1”(必须在数组开头的元素)。然后交换两个元素。在任何时间点,如果指针相互交叉,则数组已按要求排序。
以下 java 代码将执行此操作:最初变量 endi 和 endj 指向最后一个元素(第二个指针),变量 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;
}
}
}
对上述代码的其他改进可能是可能的,例如删除用于递减指向函数的指针并调用它的代码。但是代码可以正常工作。