华为oj------二维数组的列排序(数组排序)

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


含义:就是说按第二列的元素对行排序,如果a、b行的第二列元素相同,则比较它们的第三列的大小

#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
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值