先按行排序,然后按列排序:
import java.util.Scanner;
public class Text {
public static void main(String[] args) {
//int[][] array= {{4,2},{1,7},{4,5},{1,2},{1,1},{4,1}};
int[][] array= {{1,2,2,2,2},{1,2,2,7,2},{4,1,2,2,1},{1,3,2,3,6},{1,2,9,1,9},{4,8,2,9,8}};
sort(array);//先按行排序,再按列排序
for(int i=0;i<array.length;i++) {
for(int j=0;j<array[0].length;j++)
System.out.print(array[i][j]+" ");
System.out.println();
}
}
public static void sort(int[][] array) {
for(int i=0;i<array.length-1;i++)//行排序
for(int j=0;j<array.length-1-i;j++)
if(array[j][0]>array[j+1][0])
swap(array[j],array[j+1]);
for(int f=1;f<array[0].length;f++)//f为当前要排序的列
for(int i=0;i<array.length;) {
int count=0;
int num=array[i][f-1];
if(f==1) {
for(int j=0;j<array.length;j++)
if(array[j][0]==num)
count++;
}
else {//第一列以外的列 要统计该列之前所有列都和上一行相同的行的出现次数来决定该轮还要排序的次数
for(int j=0;j<array.length;j++) {
boolean isSame=true;
for(int p=1;p<=f;p++)
if(array[j][f-p]!=array[i][f-p]) {
isSame=false;
break;
}
if(array[j][f-1]==num&&isSame)
count++;
}
}
for(int k=0;k<count-1;k++)
for(int q=0;q<count-1-k;q++)
if(array[i+q][f]>array[i+q+1][f])
swap(array[i+q],array[i+q+1]);
i+=count;//i为下一个不同的数的行下标
}
}
public static void swap(int[] a,int[] b) {//交换一行
int temp;
for(int j=0;j<a.length;j++) {
temp=a[j];
a[j]=b[j];
b[j]=temp;
}
}
}
小结:
开始的时候由于书上给的示例是一个6X2数组,导致思维被限制在只有两列的范围内,把f直接当作了1。事实上,应该考虑更多列的情况,因此应该设置一个变量f来指示当前需排序的列。
其中最值得一提的是计算count时要分情况讨论:不是第一列的情况下需要判断该列之前的所有列的值是否和上一行相等。因为这时候该列以前的列都已经排序完毕,若没有多加这个判断就有可能出现错误。
一开始只考虑到了该列的前一列需要比较,若和上一行的前一列相等count才加1。实际上这还是欠缺考虑。
eg.
{1,2,2,2,2}
{4,1,2,2,1}
例如上示这种情况,若没有进行之前所有列 isSame的判断下面的行就会和上面的行进行交换,导致结果出错。
这里由于未知前面有几列,isSame可以用一个循环来获得判断结果。
实现效果: