java - 在没有行/列顺序的情况下将二维 (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
解决方案
我做的。花了两天时间想出一个算法。它不是一个完美的算法,甚至可能没有得到很好的优化。但它有效。
解释
想法是从某个元素(比如 0,0)到数组末尾(iealength,a[0].length)获取最小值并将其与某个元素交换。在这里,我创建了一个图表以更好地理解逻辑。
我们这样做直到我们到达最后一个元素,瞧!我们有一个排序的二维数组。
代码 [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;
}
}
}
}
瞧,现在你有了一个排序的二维数组。享受数据。
推荐阅读
- excel - 复制/粘贴合并单元格以保持格式
- python - 调整 numpy 数组的大小以使用 train_test_split sklearn 函数?
- webpack - 为 MODx 开发前端/模板的正确方法
- fortran - 重载过程是否有可能具有与其父类不同的接口?
- angular - ag-grid : 手动设置 rowHeight
- c - csv文件可视化程序
- javascript - 带有隐藏 div 的 HTML 损坏格式
- python - 如何模拟使用别名导入的函数?
- python - 列/索引的熊猫样式 set_table_styles 不适用于 to_excel
- html - CSS类不应用样式