Java 2d数组排序合并为1d

时间:2014-03-17 13:26:44

标签: java arrays

我有一个有序的2维数组(行按升序排列)。我想将它转换为一个已排序的1维数组,以便在我的一个函数中使用它。我该怎么做?

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

只需遍历2D数组并将值分配到一维数组中。

答案 1 :(得分:1)

最简单的方法是:

  1. 计算元素总数
  2. 分配新阵列
  3. 循环遍历数组,将它们添加到新的
  4. 对结果使用Arrays.sort()。
  5. 您可以使用数组已经排序的事实来尝试使用插入做一些奇特的事情,但性能提升会很小,并且代码复杂性的增加会很大。你更有可能添加bug而不是获得性能。

    要进行排序插入,您需要为每个源数组添加一组索引。

    1. 计算元素总数
    2. 分配新阵列
    3. 遍历所有数组并找到具有最低(或最高取决于排序方向)值的数组
    4. 插入该值并将该源数组和目标数组的索引增加一个。
    5. 返回步骤3,直到所有源数组中的数据耗尽

答案 2 :(得分:0)

假设您的二维数组是R Rows和C列。 你可以

  1. 创建一个大小为R x C的单维数组。
  2. 使用R索引,每行一个并在您的单维数组中插入(在循环中)每次迭代中值的次要(一旦获取整行,就要小心。必须对此进行管理)
  3. 最后,你应该有一个单维数组,所有元素已经排序,无需进一步操作。

答案 3 :(得分:0)

假设子数组具有相同的长度,并且每行的第一个元素不小于前一行的最后一个元素:

Object[][] twoDArray;
// you are initializing it with some code here
int len = 0;
for (Object[] x : twoDArray) {
    len += x.length;
}
Object[] oneDArray = new Object[len];
for (int i=0; i<len; ++i) {
    oneDArray[i] = twoDArray[i/twoDArray.length][i%twoDArray.length];
}

这有O(n + m)复杂度。

如果我的第二个假设是错误的(正如您在评论中指出的那样),那么您应该在最终阵列上调用Arrays.sort。最终的复杂性将是O(n + m + nlogn)。

几乎可以肯定的是,您无法优化排序。在数组转换过程中进行排序将需要每次子迭代进行另一次完整迭代,以便将元素从下一行插入其正确位置,然后将每个元素向前移动一个索引。