C C++ 二维数组第一列升序,第一列相同第二列降序_c++二维数组根据第一列排序(2)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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


![img](https://img-blog.csdnimg.cn/img_convert/97b4175db1c2c20d28e61a207649245b.png)
![img](https://img-blog.csdnimg.cn/img_convert/470a1450c33303f4ae600dcdc7c74b3b.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

pics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值