使用所有元素进行二维数组排序

时间:2013-01-08 15:27:07

标签: java arrays

我现在正在我的程序中处理这段代码,似乎问题出在我停止第二维内环的那一行。

这是数组的示例输出

  • 9 6 6
  • 7 6 4
  • 4 8 5

当我运行此代码时,输​​出为:

  • 4 4 6
  • 5 6 6
  • 7 8 9

我的预期输出是:

  • 4 4 5
  • 6 6 6
  • 7 8 9

数字:“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);
}

3 个答案:

答案 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数组。 (希望这在你教授的眼中是有效的)