题目
描述:
给出一个二维数组,请将这个二维数组按第i列(i从1开始)排序,如果第i列相同,则对相同的行按第i+1列的元素排序,如果第i+1列的元素也相同,则继续比较第i+2列,以此类推,直到最后一列。如果第i列到最后一列都相同,则按原序排列。
实现以下接口:
输入一个m*n 的整数数组,实现按规则排列,返回排列后的数组。
调用者会保证:
比如输入数组为:
1,2,3
2,3,4
2,3,1
1,3,1
按第二列排序:
输出:
1,2,3
2,3,1
1,3,1
2,3,4
练习阶段: 初级
代码
/*---------------------------------------
* 日期:2015-06-30
* 作者:SJF0115
* 题目:二维数组的列排序
* 来源:华为上机
-----------------------------------------*/
#include <vector>
#include <algorithm>
#include "oj.h"
using namespace std;
// 功能:排列一个m行n列 大小的数组
// 输入: int * pArray 指向数组第一个元素的指针,m为行数, n为列数 ,请按第i列排列
// 输出:按第i列排序完成后的数组放到入参指定的地址中 (i的取值范围 1 - n)
// 返回:
int sortIndex = 0;
int col = 0;
// 按列排序
bool cmp(const vector<int> &a, const vector<int> &b){
for(int i = sortIndex - 1;i < col;++i){
if(a[i] == b[i]){
continue;
}//for
else{
return a[i]<b[i];
}//else
}//for
return a[col-1] < b[col-1];
}
void RangeArray(int * pArray,unsigned int m, unsigned int n,unsigned int i){
if(pArray == NULL || m <= 0 || n <= 0 || i >= n){
return;
}//if
sortIndex = i;
col = n;
// 一行
vector<int> rowVec;
vector<vector<int>> matrix;
int *array = pArray;
// 存放在vector
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
rowVec.push_back(*array);
array++;
}//for
matrix.push_back(rowVec);
rowVec.clear();
}//for
// 排序
sort(matrix.begin(),matrix.end(),cmp);
// 排序后的数据放入pArray
array = pArray;
for(int i = 0; i < m;++i){
for(int j = 0;j < n;++j){
*array = matrix[i][j];
array++;
}//for
}//for
}