【发布时间】:2021-11-20 05:48:31
【问题描述】:
我正在处理一个二维数组,我需要将它作为一个整体进行排序,而不是像单行/一列排序那样。 说,
8 7 9 3
-2 0 4 5
1 3 6 -4
应该是这样的,
-2 -1 0 1
2 3 4 5
6 7 8 9
【问题讨论】:
标签: java arrays sorting matrix multidimensional-array
我正在处理一个二维数组,我需要将它作为一个整体进行排序,而不是像单行/一列排序那样。 说,
8 7 9 3
-2 0 4 5
1 3 6 -4
应该是这样的,
-2 -1 0 1
2 3 4 5
6 7 8 9
【问题讨论】:
标签: java arrays sorting matrix multidimensional-array
我做到了。 花了两天时间想出一个算法。它不是一个完美的算法,甚至可能没有得到很好的优化。但它有效。
想法是从某个元素(例如 0,0)到数组末尾(即 a.length,a[0].length)获取最小值并将其与某个元素交换。 在这里,我创建了一个图表以更好地理解逻辑。
我们这样做,直到我们到达最后一个元素,瞧!我们有一个有序的二维数组。
现在,我失去了两个脑细胞的有趣部分来了。守则。
我所做的是创建一个函数,它返回数组中的最小值。 该函数有两个参数,它们是起始元素索引,即 (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;
}
}
}
}
瞧,现在你有了一个排序的二维数组。享受数据。
【讨论】: