【问题标题】:How to Sort a 2D array?如何对二维数组进行排序?
【发布时间】:2013-09-13 08:22:36
【问题描述】:

我需要对二维数组进行排序的帮助。我有两行数组

[5, 3, 4, 1, 2]
[10,20,30,40,50]

我需要将其排序为如下所示:

[1, 2, 3, 4, 5]
[40,50,20,30,10]

我知道如何使用冒泡排序来做到这一点,但我需要一些更快的算法,例如快速排序。

这是我的冒泡排序代码

   for (int i = 0; i < length-1; i++) {
         for (int j = 0; j < length-i-1; j++) { 

            if (array[0][j] > array[0][j+1]) {

               for (int k = 0; k < 2; k++) {
               int tmp = array[k][j];
               array[k][j] = array[k][j+1];
               array[k][j+1]=tmp;
               }
           }
       }
    }

【问题讨论】:

标签: java arrays sorting


【解决方案1】:

转置二维数组java multi-dimensional array transposing

使用Arrays.sort(T[] a, Comparator&lt;? super T&gt; c),比较器在每行的索引 0 上进行比较

再次转置结果:

例如

来自:[5,3,4,1,2] [10,20,30,40,50]

获取[5, 10] [3, 20] [4, 30] [1, 40] [2, 50]

然后将它们排序到[1, 40] [2, 50] [3, 20] [4, 30] [5, 10]

然后再次转置为:[1,2,3,4,5] [40,50,20,30,10]

或者自己实现快速排序。

【讨论】:

    【解决方案2】:

    编辑(在 OP 更改配方后):

    您可以将所有内容收集到 Map 中,然后按键对其进行排序。收集到 Map 是 O(n),您可以使用有序 Map 实现免费排序。转置对我来说看起来更贵

    【讨论】:

    • 不,我需要对第一行和第二行进行排序。第一个是索引,第二个是值。
    • @JakubMartinek 这正是这样做的。将您的二维数组转换为Map。快速排序键集(或您要使用的任何算法)。然后,如果由于某种原因它确实必须是array,则通过迭代Mapkeyset 将其转换回数组。这是一个很好的解决方案,但前提是密钥必须是唯一的,任何重复的密钥都将被丢弃
    • @StormeHawke,这是对我之前的帖子编辑的评论,由于问题陈述不正确,我告诉了不正确的解决方案:)
    • @cdshines 哦。我的坏:)
    【解决方案3】:

    你考虑过合并排序算法吗?

    http://en.wikipedia.org/wiki/Merge_sort 在这种情况下,这应该是最快的。 (wiki 中也有抽象实现)

    【讨论】:

      【解决方案4】:

      您可以使用 Comparator 来做到这一点。 This thread has some useful information for C++ 。 Java中的示例代码是这样的,

      Arrays.sort(a, new Comparator<Long[]>() {
      
              @Override
              public int compare(Long[] o1, Long[] o2) {
      
                  Long t1 = o1[1];
                  Long p1 = o1[0];
                  Long t2 = o2[1];
                  Long p2 = o2[0];
      
                  if (t1 == t2) {
                      return (p1 > p2 ? 1 : (p1 == p2 ? 0 : -1));
                  } else {
                      return (t1 < t2 ? -1 : 1);
                  }
      
              }
          });
      

      compare 方法中进行比较登录并返回相关值以对数组进行相应的排序。

      【讨论】:

        猜你喜欢
        • 2013-08-17
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        相关资源
        最近更新 更多