package com.cdl.matrix;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
*@source:http://blog.csdn.net/justinavril/archive/2009/12/14/5003467.aspx
*
*@function: 矩阵A
*
* 68 36 22
*
* 59 77 39
*
* 81 20 17
*
* 将矩阵A每列排序之后(升序排列)应该得到的矩阵是:
*
* 矩阵B:
*
* 59 20 17
*
* 68 36 22
*
* 81 77 39
*
* 这样矩阵A中每个元素在矩阵B中对应的位置就是
*
* 矩阵C:
*
* 2 3 3
*
* 1 1 1
*
* 3 2 2
*
* 问:由矩阵A得到矩阵C的算法?
*
* @author ocaicai@yeah.net 2011-6-27
*
*/
public class MatrixColSort {
/**
* @param args
*/
public static void main(String[] args) {
int[][] initArray = { { 68, 36, 22 }, { 59, 77, 39 }, { 81, 20, 17 } };
System.out.println("原来的数组:");
printArray(initArray);
System.out.println("排序后的数组:");
MatrixElement[][] transferedArray = transferByElement(initArray);
MatrixElement[][] sortedArray = sortArrayCols(transferedArray);
int[][] targerArray = getRowsArray(sortedArray);
printArray(targerArray);
}
/**
* 将数组中单个的value转换成Element(value,rowIndex)
*
* @param sourceArray
* @return
*/
public static MatrixElement[][] transferByElement(int[][] sourceArray) {
int rows = sourceArray.length;
int cols = sourceArray[0].length;
MatrixElement[][] elementArray = new MatrixElement[rows][cols];
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
elementArray[row][col] = new MatrixElement(
sourceArray[row][col], row + 1);
}
}
return elementArray;
}
/**
* 获取某一列的值存入一个临时的tempList中,
*
* 然后对这个tempList赋整列的值然后对其排序,
*
* 再把排序后的tempList赋值回列去
*
* @param elementArray
* 被转换的对象
* @return
*/
public static MatrixElement[][] sortArrayCols(MatrixElement[][] elementArray) {
int rows = elementArray.length;
int cols = elementArray[0].length;
for (int colIndex = 0; colIndex < cols; colIndex++) {
List<MatrixElement> tempList = new ArrayList<MatrixElement>();
for (int rowIndex = 0; rowIndex < rows; rowIndex++) {
tempList.add(elementArray[rowIndex][colIndex]);
}
Collections.sort(tempList);
for (int rowIndex = 0; rowIndex < rows; rowIndex++) {
elementArray[rowIndex][colIndex] = tempList.get(rowIndex);
}
}
return elementArray;
}
/**
* @param elementArray
* 从其中获取rowIndex,做成一个数组返回去
* @return
*/
public static int[][] getRowsArray(MatrixElement[][] elementArray) {
int rows = elementArray.length;
int cols = elementArray[0].length;
int[][] rowArray = new int[rows][cols];
for (int row = 0; row < rows; row++)
for (int col = 0; col < cols; col++)
rowArray[row][col] = elementArray[row][col].getRowIndex();
return rowArray;
}
/**
* 打印二维数组
*
* @param array
*/
public static void printArray(int[][] array) {
for (int i = 0; i < array.length; i++)
System.out.println(Arrays.toString(array[i]));
}
}
使用到的MatrixElement类:
package com.cdl.matrix;
public class MatrixElement implements Comparable<MatrixElement> {
int value;
int rowIndex;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public int getRowIndex() {
return rowIndex;
}
public void setRowIndex(int rowIndex) {
this.rowIndex = rowIndex;
}
public MatrixElement(int value, int rowIndex) {
this.value = value;
this.rowIndex = rowIndex;
}
@Override
public int compareTo(MatrixElement anotherEmlement) {
//比较只需要对value比较
int valueCmp = this.value - anotherEmlement.value;
return valueCmp;
}
}
输出结果:
原来的数组:
[68, 36, 22]
[59, 77, 39]
[81, 20, 17]
排序后的数组:
[2, 3, 3]
[1, 1, 1]
[3, 2, 2]
.
分享到:
相关推荐
对于0-1背包问题,可以构建一个二维数组\(dp[i][j]\),其中\(dp[i][j]\)表示前i个物品在背包容量为j的情况下可以获得的最大价值。利用动态规划公式更新\(dp\)数组。 **核心公式**: - \(dp[i][j] = \max(dp[i-1][j...
邻接矩阵是一个二维数组,表示每个顶点与其他顶点是否有边相连;邻接链表则是为每个顶点创建一个链表,链表中的元素表示与其相邻的顶点。 2. 图的遍历:图的遍历主要有深度优先搜索(DFS)和广度优先搜索(BFS)两种。...
在这个实验中,使用二维数组模拟棋盘,每个元素代表一个格子。 伪码算法大致如下: 1. 设置初始骨牌序号和棋盘数组。 2. 设定递归函数`chessBoard`,参数包括棋盘的左上角坐标、特殊方格的位置和棋盘大小。 3. 当...
例如,`[y, i] = max(a, [], 2)` 是沿着第二维(列)寻找最大值(这里用于每门课程找最高分),`[z, j] = max(d, [], 2)` 是对三门课总分求最大值及其索引。 2. 总分排序: `sum(a)` 计算每个学生三门课的总分,`...
- `sum1` 函数要求计算二维数组 A[m][n] 的边缘元素之和。边缘元素包括数组的第一行、最后一行、第一列和最后一列的元素。 - `sum2` 函数需找到数组中从 A[0][0] 开始的所有互不相邻的元素之和。互不相邻意味着...
- **定义**: 类似于子段和问题,但针对二维数组。 - **应用场景**: 在图像处理、数据分析等领域。 - **实现方法**: - 同样可以采用动态规划的方法。 #### 字典序全排列与序号的转换 - **定义**: 给定一组元素,求...
- 包括矩阵对角线元素之和、元素平均值、最大值等,这些都涉及到二维数组的遍历和计算。 23-24. 矩阵元素最大值: - 对于矩阵中的元素,找到最大值及其位置。 25. 矩阵对称性检测: - 检查矩阵的对角线元素与其...
邻接矩阵是存储图的一种方法,它通过二维数组来表示图中各个顶点之间的连接关系。在`Graph_Matrix`类中,邻接矩阵`edge`被用来存储图的边信息,其中`edge[i][j]`的值表示顶点i到顶点j的权值,如果图是无向的,`edge...
• 使用两个一维数组构造二维数组 • 部门评价等级转换 • 使用MMULT 函数计算产品结构指数 • 产生1-10 的自然数垂直序列和水平序列 • 等比例构造一维循环数组 • SUMIF函数对产品产量进行逐行汇总 • 利用MMULT...
33. 二维数组的输入输出,需要理解数组的存储方式和指针操作。 34. 学生成绩管理,涉及查找最高分和对应的学生序号。 35. 冒泡排序,通过交换相邻元素实现升序排列。 36. 选择排序,通过找到未排序部分的最大值并...
代码可能还涉及到网格生成,如使用`delquad`或第三方工具如`Triangle`来生成二维有限元网格。 总的来说,这个压缩包提供了一种使用MATLAB解决微分边界问题的途径,结合有限元和可能的边界元概念。通过对“MATLAB_...
7、迷宫求解:用二维矩阵表示迷宫,自动生成或者直接输入迷宫的格局,确定迷宫是否能走通,如果能走通,输出行走路线。 8、英国人格思里于1852年提出四色问题(four colour problem,亦称四色猜想),即在为一平面或...
文件指出,当尝试通过`void insert(char tmp[])`这样的方式传递二维字符数组时,直接使用`insert(str[i])`会导致编译错误。 **解决方案与注意事项:** - 传递指针而非值:使用`insert(str[i])`时,实际上传递的是...
- 使用二维数组表示图的存储方式。 - **4.5.2 邻接表** - 使用链表表示图的存储方式。 - **4.5.3 双链式存储结构** - 结合了邻接矩阵和邻接表的优点。 **4.6 图ADT实现设计** - 设计图的抽象数据类型。 **4.7 ...
4. **数组的存储**:二维数组A[50][60]按行优先顺序存储,元素长度为4字节,A[18][25]的地址可以通过公式计算得出,这里给出的答案是D.4620。 5. **逻辑结构与存储方式**:数据的逻辑结构描述的是数据元素间的逻辑...
1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 ...
1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 ...
1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 ...
2. **邻接矩阵的应用**:对于无向图,邻接矩阵是一个二维数组,用于表示图中各个顶点之间的连接关系。它可以用以下方式解决问题: - (1) 边的数量可以通过计算矩阵中非零元素的数量得出。 - (2) 两个顶点之间是否...