首页 > 解决方案 > 在没有行/列顺序的情况下将二维 (2D) 数组作为一个整体进行排序

问题描述

我正在研究一个二维数组,我需要将它作为一个整体进行排序,而不是像单行/一列排序那样。说,

8   7   9   3
-2  0   4   5
1   3   6  -4

它应该看起来像这样,

-2  -1  0  1
 2   3  4  5
 6   7  8  9

标签: javaarrayssortingmatrixmultidimensional-array

解决方案


我做的。花了两天时间想出一个算法。它不是一个完美的算法,甚至可能没有得到很好的优化。但它有效。


解释

想法是从某个元素(比如 0,0)到数组末尾(iealength,a[0].length)获取最小值并将其与某个元素交换。在这里,我创建了一个图表以更好地理解逻辑。

将矩阵排列为一个整体的 N 步逻辑

我们这样做直到我们到达最后一个元素,瞧!我们有一个排序的二维数组。


代码 [JAVA]

现在,这是我失去两个脑细胞的有趣部分。编码。

我所做的是创建一个函数,它返回数组中的最小值。该函数有两个参数,它们是起始元素索引,即(i,j),它应该从中运行循环以结束并返回最小值及其在列表中的索引。

//Helper Method

//row = Row Of Element To Began Loop From 
//column = Column Of Element To Began Loop From.
List get_min(int row,int column) 
{
    List<Integer> l = new ArrayList<Integer>();  // List To Return with the output.

    int mn=a[row][column], mni=0,mnj=0;    

    //mni= The Row Of Minimum Element
    // mnj = The Column Of Minimum Element

    for(int i=row;i<a.length;i++)
    {
        for(int j=column;j<a[0].length;j++)
        {
            if(mn>a[i][j])
            {
                mni = i;
                mnj = j;
                mn=a[i][j];
            }
        }
        column=0;  // This needs to be zero, just so the next time Row Updates The Loop doesn't began from the 2nd Element But 0.
    }
    l.add(mn); l.add(mni); l.add(mnj);
    return l;
}

现在我们有一个包含三个值的列表,最小元素、最小元素行、最小元素列。我们现在可以使用上面的 Helper 方法构建一个简单的交换函数。

void sort_array()
{
    for(int i=0; i<a.length;i++)
    {
        for(int j=0;j<a[0].length;j++)
        {
            List<Integer> l = get_min(i, j);  // List with Minimum Value As In Step 1,Step 2, Step 3
            if(a[i][j]>l.get(0))  // Check To Prevent Last Value Replacing The First Element
            {
                //Simple Swap
                int t = a[i][j];
                a[i][j] = l.get(0);
                a[l.get(1)][l.get(2)] = t;
            }
        }
    }
} 

瞧,现在你有了一个排序的二维数组。享受数据。


推荐阅读