问题描述:
二维数组按照第一列从小到大的顺序进行排列,如果第一列相同,则按照第二列的大小进行排列,以此类推,得到最后经过排序的数组
解题思路:
由于数据维度不大,这里我们采用的是冒泡排序:(采用快排或者其他方法也可以使用下面的小技巧)
对于第一列相等的数据,我们没有办法立马决定是否进行交换,还需要对第二行进行判断;如果第一行相等的数据有多个(三个或三个以上),要判断出是否进行交互可能比较的列数是不同的,这样可能就会出现多层循环,计算复杂度较高。
为了避免多重循环,我们希望尽量在一次就可以对所有数据进行排序,这里我们直接使用了一个技巧:在计算的时候,如果遇到第一列值相等的值无法判断是否进行交换,就将两个值累加后一列(第二列)的数据,如果还是相等就再累加再后一列(第三列),直到计算出有大小的值,判断这两行是否需要进行交换。
代码:
#include <iostream>
#include <algorithm>
#include <vector>
#define M 3
#define N 4
using namespace std;
int main()
{
//int n=4,m=3;
int a[N][M]={{3,4,2},{3,2,7},{3,2,2},{1,2,4}};
int i,j;
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++){
if(a[i][0]>a[j][0])
swap(a[i],a[j]);
else if(a[i][0]==a[j][0]){
int ll=0,rr=0,k=0;
while(k<M && ll==rr){
ll+=a[i][k];
rr+=a[j][k];
if(ll>rr){
swap(a[i],a[j]);
break;
}
k++;
}
}
}
//打印数组
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
cout<<a[i][j]<<" ";
cout<<" "<<endl;
}
return 0;
}
运行结果:
对于原数组
{3,4,2},{3,2,7},{3,2,2},{1,2,4}
经过排序后可以得到: