C/C++ 二维数组第一列升序,第一列相同第二列降序

19 篇文章 0 订阅

数组排序有内置API,一般是一维的,这里分享下二维或者多维的用法

下面先分享下C++的情况,C++有好几个排序API,其内部实现一般是快排,包括稳定不稳定部分排序等。

1 C++ 二维数组第一列升序,第一列相同第二列降序

这里使用sort来完成,默认是升序,不管是一维,二维,多维,没有第三个参数都是按第一列升序排序

  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
	 _Compare __comp)
	 {...}
  1. 你只需要指定开始、结束的迭代器
  2. 比较方法__comp

下面是一个简单的案例

    /**二维数组第一列升序,第一列相同第二列降序 */
    vector<vector<int>> v = {{5, 4}, {6, 4}, {6, 7}, {2, 3}, {5, 2}, {1, 8}};
    sort(v.begin(), v.end(), [](const vector<int> &a, const vector<int> &b) { return a[0] == b[0] ? b[1] < a[1] : a[0] < b[0]; });

    for(const auto& e : v){
        for(const auto& i : e) {
            cout << i << ", ";
        }
        cout << '\n';
    }

下面是输出,可以看出,第一列升序,第一列相同第二列降序

1, 8, 
2, 3, 
5, 4, 
5, 2, 
6, 7, 
6, 4, 

对于通用算法,它的适用性很强,多维也是可以的,只要想好__comp,这里直接用lambda即可

  1. 参数是两个一维数组,一般都是const引用,避免拷贝!!相当于第一次比较的是两个数组{5, 4}, {6, 4}
  2. 之后简单的写出比较方式,返回值是bool,不能在谓词写一些无关的语句,这里只有一个return表示比较方式。

2 C 二维数组第一列升序,第一列相同第二列降序

C语言库函数qsort也是可以的,它也可以使用二维或者高维,但是比较函数必须自己写

extern void qsort (void *__base, size_t __nmemb, size_t __size,
		   __compar_fn_t __compar);
  1. __base 表示待比较的数组首地址,当然就是数组名咯
  2. __nmemb 表示数组的第一维的大小,对于二维数组就是有多少行,sizeof(v2) / sizeof(v2[0]),也就是6个
  3. __size 表示一个数组的大小,也就是每行的大小,sizeof(v2[0]),也就是2个int大小的存储
  4. __compar比较方法,必须是如下形式
typedef int (*__compar_fn_t) (const void *, const void *);

这是一个别名,对于函数指针的别名,直接去掉typedef(不像一般的别名书写的形式),如下,也就是__compar_fn_t表示两个const void*的形参,返回值是int的函数

int (*__compar_fn_t) (const void *, const void *);

下面是一个案例

int cmp(const void* a, const void* b)  {
    return ((int*)a)[0] == ((int*)b)[0] ? ((int*)b)[1] > ((int*)a)[1] : ((int*)a)[0] > ((int*)b)[0];
}
    int v2[6][2] = {{5, 4}, {6, 4}, {6, 7}, {2, 3}, {5, 2}, {1, 8}};
    int hang = sizeof(v2) / sizeof(v2[0]);
    qsort(v2, hang, sizeof(v2[0]), cmp);

    int lie = sizeof(v2[0]) / sizeof(v2[0][0]);
    for(int i = 0; i < hang; ++i){
        for(int j = 0; j < lie; ++j) {
            cout << v2[i][j] << ", ";
        }
        cout << '\n';
    }

3 更一般的思路

struct node//结构体定义 
{
    int a;
    int b;
    int c;
};
bool cmp(node x,node y)//这个cmp是先按照a进行降序排序,如果a相同然后对b升序排序,如果b相同最后对c降序排序 
{
    if(x.a != y.a)
    return x.a<y.a;
    if(x.b != y.b)
    return x.b>y.b;
    if(x.c != y.c)
    return x.c<y.c;
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值