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]
.
分享到:
相关推荐
主要介绍了C#实现对二维数组排序的方法,实例分析了C#数组遍历与排序的相关技巧,需要的朋友可以参考下
// 二维数组冒泡排序 public static void main(String[] args) { int i=0, j=0, temp = 0; int[][] nums1 = { { 34, 1, 22, 5 }, { 28, 98, 15, 32 }, { 33, -5, 17, 41 } }; int rows = nums1.length; //二维...
VB.NET二维数组快速排序(更新) 'OldArrays(),为排序二维数组;NewArrays(),为存放结果数组,SortColumnsOrOrders(),传递排序参数数组,偶数个为排序列号,奇数为升降序,0为升序,1为降序;FieldRow,是否有字段行...
不要看分数高,这个程序绝对可以对得起大家的分数。这个楼主的研究哈!反正下了评价后分数可以返还的................
二维数组排序.vi
在c++中,经常调用函数,而子函数经常要返回的值是数组,无论一维数组还是二维数组都需要运用到指针的知识。一维数组不再过多叙述,给了一个实例如何返回二维数组,希望对大家有帮助(主要用到指针的知识,看不懂的...
二维数组的排序,其中包含冒泡排序、选择排序、插入排序和快速选择排序。
VB二维数组排序源码
使用冒泡排序实现的java语言编写的关于二维数组的排序,实现了行、列的排序输出。
思路以及注意点、说明我都加在了代码旁边的注释里,好好悟悟!
C# json 一维数组 和 二维数组的转换 写的非常详细,对大家有帮助
用labview在While循环中实现二维数组的逐行排序,用两个for循环
一维数组转二维数组
C语言程序设计-求出二维数组周边元素之和,作为函数值返回;二维数组的值在主函数中赋予;
用C++语音实现一维数组二维数组写入txt,从txt中读取数据存到一维数组、二维数组,数组用指针表示
c++ c语言编写 二维数组的 冒泡排序 范例
二维数组排序.zip源码Labview个人项目资料程序资源下载二维数组排序.zip源码Labview个人项目资料程序资源下载二维数组排序.zip源码Labview个人项目资料程序资源下载二维数组排序.zip源码Labview个人项目资料程序资源...
将labview内二维数组方便的转化为一维数组使用
CStringArray二维数组CStringArray二维数组CStringArray二维数组CStringArray二维数组CStringArray二维数组CStringArray二维数组CStringArray二维数组CStringArray二维数组