java - 在 3D Young Tableau 上调用 Maxify?

标签 java arrays sorting multidimensional-array

我正在创建一个最大 3D young 画面,因此 int[0][0][0] 将具有画面中最大的整数。所有行、列和 Pane 均按降序排序。我正在尝试为此创建 maxify 方法,但效果不太好。我尝试修改 here 中的 youngify 方法,这就是我到目前为止所拥有的:

private void maxify(int i, int j, int k) {
    int largex = 0, largey = 0, largez = 0, x = 0, y = 0, z = 0;
    while (true) {
        x = largex;
        y = largey;
        z = largez;
        if (x + 1 > i && x + 1 < tableau.length && tableau[x + 1][y][z] > tableau[x][y][z]) {
            largex = x + 1;
            largey = y;
            largez = z;
        }
        if (y + 1 > j && y + 1 < tableau[0].length
                && tableau[x][y + 1][z] > tableau[largex][largey][largez]) {
            largex = x;
            largey = y + 1;
            largez = z;
        }
        if (z + 1 > k && z + 1 < tableau[0][0].length
                && tableau[x][y][z + 1] > tableau[largex][largey][largez]) {
            largex = x;
            largey = y;
            largez = z + 1;
        }
        if (largex != x || largey != y || largez != z) {
            tableau[x][y][z] = tableau[x][y][z] ^ tableau[largex][largey][largez];
            tableau[largex][largey][largez] = tableau[x][y][z]
                    ^ tableau[largex][largey][largez];
            tableau[x][y][z] = tableau[x][y][z] ^ tableau[largex][largey][largez];
            maxify(largex, largey, largez);
        } else
            break;
    }
}

下面是在 3x3x1 数组上调用时发生的情况的示例。

Starting with this array:
123
456
789

After first loop:    
423
156
789

And so on....    
423
156
789

423
756
189

423
756
189

423
756
819

423
756
819

423
756
891

423
756
891

423
756
891

完成的数组:

423

756

891

根本没有完全排序。谁能看出我错过了什么吗?

最佳答案

原始的youngify()方法实际上并没有对整个二维数组进行排序!问题是,在检测到要完成交换后,例如在第二行,下一次迭代从交换发生的位置(即从第二行开始)开始,而不管第一行的元素可能需要的其他交换行,但在其他维度上。换句话说,它首先垂直地然后水平地向下筛选第一个元素。

这就是程序输出显示的内容:1 垂直移动,与 4 和 7 交换,然后水平移动,与 8 和 9 交换。总之,youngify()无论数组的其余部分如何,方法都会正确地向下筛选左上角的元素。使用 {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}} 尝试原始的 youngify() 方法数组,您会看到行为完全相同。

反复筛选左上角元素可以完成这项工作吗?不一定:如果最高元素已经位于左上角位置,则根本不会[进一步]排序。

我的建议是对每个维度的多维数组“行”进行“行”排序。我编写了以下代码:

private static void maxify(int[][][] tableau) {
  int ii = tableau.length;
  int jj = tableau[0].length;
  int kk = tableau[0][0].length;
  // Sort on k-rows
  for (int i = 0; i < ii; i++) {
    for (int j = 0; j < jj; j++) {
      // Since k-rows are already standard arrays, no temporary array needed here.
      reverseSort(tableau[i][j]);
    }
  }
  // Sort on j-rows
  for (int i = 0; i < ii; i++) {
    for (int k = 0; k < kk; k++) {
      int[] temp = new int[jj];
      for (int j = 0; j < jj; j++) {
        temp[j] = tableau[i][j][k];
      }
      reverseSort(temp);
      for (int j = 0; j < jj; j++) {
        tableau[i][j][k] = temp[j];
      }
    }
  }
  // Sort on i-rows
  for (int j = 0; j < jj; j++) {
    for (int k = 0; k < kk; k++) {
      int[] temp = new int[ii];
      for (int i = 0; i < ii; i++) {
        temp[i] = tableau[i][j][k];
      }
      reverseSort(temp);
      for (int i = 0; i < ii; i++) {
        tableau[i][j][k] = temp[i];
      }
    }
  }
}

private static void reverseSort(int[] a) {
  Arrays.sort(a);
  for (int i = 0; i < a.length / 2; i++) {
    a[i] ^= a[a.length - i - 1];
    a[a.length - i - 1] ^= a[i];
    a[i] ^= a[a.length - i - 1];
  }
}

我希望这会有所帮助......

干杯,

杰夫

关于java - 在 3D Young Tableau 上调用 Maxify?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32804746/

相关文章:

java - Gson.fromJson(json, Custom.class) 空字符串

Java/安卓 : Define object with unknown type

java - 使用 Java Stream anymatch 和过滤器进行 null 检查

PHP——数组中的数组?不确定,使用 ajilion MySQLidb 类需要获取原始查询的值

c++ - CArray 内存泄漏

java - java.util.stream.Stream<T>.sorted() 的大 O 复杂度

c - 了解链表排序

java - 首次在 Android 应用程序中显示条款和条件

c++ - 将数组的原始指针转换为 unique_ptr

Ruby:如何从日期时间字符串中提取一个小时(或一天)