[华为机试练习题]21.二维数组的列排序

题目

描述:     

给出一个二维数组,请将这个二维数组按第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
}



上一篇:[CareerCup] 11.2 Sort Anagrams Array 异位词数组排序


下一篇:json字符串与对象如何相互转换