我现在正在我的程序中处理这段代码,似乎问题出在我停止第二维内环的那一行。
这是数组的示例输出
当我运行此代码时,输出为:
我的预期输出是:
数字:“6”不在正确的位置。这是因为当我尝试运行在for循环上面有嵌套for循环的部分时,它只运行一次,所以它只检查第1列而不是到达第6列,其中6是。问题是我需要限制该循环只读取从行#0列#0到行#2列#0的最高数字。
我该如何解决这个问题?我想到使用一维数组并放置所有二维数组元素并将其排序,然后将其放回二维数组并再次打印,但这不会使我的代码解决所需的二维数组排序过程。
public static void sortArray(){
int x = len-1, y = len-1;
int iKey=0,jKey=0;
int cnt=0;
do{
cnt++;
if(y==-1){
x--;
y=len-1;
}
System.out.println(cnt+".)"+x+"-"+y);
int hi = -1;
for(i = 0;i <= x; i++)
for(j = 0;j <= y; j++){
if(twodiArray[i][j]>hi){
hi = twodiArray[i][j];
iKey = i;
jKey = j;
}
}
int temp = twodiArray[iKey][jKey];
twodiArray[iKey][jKey] = twodiArray[x][y];
twodiArray[x][y] = temp;
//dispArray();
y--;
}while(cnt<9);
}
答案 0 :(得分:1)
问题出在您搜索max element的循环中。假设您有阵列5x5和x=1
以及y=1
。然后循环将仅检查以下元素:[0] [0],[0] [1],[1] [0],[1] [1]。但它也应该检查[0] [2],[0] [3],[0] [4]。
使用您之前的代码,您只检查了以下单元格:
XX...
XX...
.....
.....
.....
但你需要检查这些:
XXXXX
XX...
.....
.....
.....
所以你需要这样的东西:
for(i = 0;i <= x; i++) {
int upper; // How many elements we need to check on current row.
if (i != x) {
upper = len - 1; // We are not in last row, so check all elements.
} else {
upper = y; // On the last row we need to check only elements up to y.
}
for(j = 0;j <= upper; j++){
if(twodiArray[i][j]>hi){
hi = twodiArray[i][j];
iKey = i;
jKey = j;
}
}
}
我的代码完全检查每一行,直到最后一行。
修改强>
如果您使用:
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= y; j++) {
...
}
}
然后你只在(0,0)的左上角和(y,x)的右下角玉米的重复上进行迭代。例如。 x = 4,y = 3:
XXX...
XXX...
XXX...
XXX...
......
但你的目标是在完成最后一行之前完成每一行。因此,请完全检查第0行,第1行和第2行以及第3行中的3个元素。我的代码做到了。 upper
显示我们需要检查除了最后一行之外的所有行的行数,它等于len - 1
(检查完整行)。对于最后一个,它是y
。
答案 1 :(得分:0)
您的交换代码(以int temp = twodiArray
开头)在主迭代循环之外。它需要在最里面的循环中移动。
顺便说一句,你可以在不存储索引的情况下进行交换。
答案 2 :(得分:0)
就个人而言,为了省去一些困惑,我会把它想象成一维阵列。
// I'm assuming that columnCount and rowCount are stored somewhere
public int getNthElement(int index) {
int colIndex = index % columnCount;
int rowIndex = (index - colIndex) / rowCount;
return twodiArray[rowIndex][colIndex];
}
public void setNthElement(int index, int value) {
int colIndex = index % columnCount;
int rowIndex = (index - colIndex) / rowCount;
twodiArray[rowIndex][colIndex] = value;
}
public void sortArray(int[][] array) {
int elementCount = rowCount * columnCount;
int curIndex = elementCount - 1;
while (curIndex >= 0) {
int highestIndex = -1;
int highestValue = 0;
for (int i = 0; i <= curIndex; i++) {
int nthValue = getNthElement(i);
if (nthValue > highestValue) {
highestIndex = i;
highestValue = nthValue;
}
}
int swapValue = getNthElement(curIndex);
setNthElement(curIndex, highestValue);
setNthElement(highestIndex, swapValue);
curIndex--;
}
}
你可以看到我仍然使用2D数组并且从不使用实际的1D数组,但是这段代码索引到数组,好像它是 1D数组。 (希望这在你教授的眼中是有效的)