C语言qosrt()函数的使用对二维数组的排序和多维数组的排序

qsort()

qosrt()这个函数很有作用,可以用来排列一维的数组,还可以排列二维的数组等高纬度的数组。除此之外,还可以排列一部分的数组元素,qsort第一个参数是数组名,第二个参数是数组的长度,第三个参数是数组成员的大小,第四个参数是比较器。

一维数组

整形的一维数组

先来一份小代码

int cmp(const void *a, const void * b)
{
    int c = *(int *)a;
    int d = *(int *)b;
    return c - d;
}
int main()
{
    int i;
    int a[5] = {1,3,2,4,0};
    qsort(a,5, sizeof(int), cmp);
    for (i = 0; i < 5; i++)
        printf("%d ",a[i]);
}
结果
0 1 2 3 4

首先我们要理解cmp的含义,cmp是一个比较器,当我们cmp返回的是一个正数时,会进行交换,例如如果上述的代码中变量c是3 d是2,c - d是大于0的,所以a[1]与a[2]进行交换。

灵活的运用

我们可以通过过改变起始位置和数组的长度来改变排列的范围

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int cmp(const void *a, const void * b)
{
    int c = *(int *)a;
    int d = *(int *)b;
    return c - d;
}
int main()
{
    int i;
    int a[5] = {1,3,2,4,0};
    qsort(a+1,3, sizeof(int), cmp);
    //我们从a[1]开始,到a[4]结束,重点是不包括a[4]
    for (i = 0; i < 5; i++)
        printf("%d ",a[i]);
}
结果
1 2 3 4 0

一维的字符数组

对于排列一维的字符数组也是一样的。因为字符的运算本质是阿斯卡码的运算。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int cmp(const void *a, const void * b)
{
    char c = *(char *)a;
    char d = *(char *)b;
    return c - d;
}
int main()
{
    int i;
    char a[5] = {'a','v','q','b','c'};
    qsort(a,5, sizeof(char), cmp);
    for (i = 0; i < 5; i++)
        printf("%c ",a[i]);
}

二维数组

整形的二维数组

先来一份小代码

int cmp(const void *a, const void * b)
{
    int* c = *(int **)a;
    int* d = *(int **)b;
    return c[0] - d[0];//如果是第二个元素排序就是c[1]与d[1]l了
}
int main()
{
    int i, fi = 4;
    int** a = malloc(sizeof(int **) * 2);
    for(i = 0; i < 2; i++)
        a[i] = malloc(sizeof(int) * 2);
    for(i = 0; i < 2; i++)
    {
        a[i][0] = fi--;
        a[i][1] = fi--;
    }
    qsort(a,2, sizeof(int*), cmp);
    for (i = 0; i < 2; i++)
        printf("%d %d\n",a[i][0],a[1][1]);
}
结果
2 3
4 3

请注意这个直接开一个二维数组是,在使用qsort()有问题的原因不知道,知道的大佬可以说一下。这里是通第一个元素从小到大的排序。

###字符的二维数组
来一份代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<string.h>
int cmp(const void *a, const void * b)
{
    char* c = *(char **)a;
    char* d = *(char **)b;
    return strcmp(c,d);
}
int main()
{
    int i;
    char fi = 'z';
    char** a = malloc(sizeof(char **) * 2);
    for(i = 0; i < 2; i++)
        a[i] = malloc(sizeof(char) * 2);
    for(i = 0; i < 2; i++)
    {
        a[i][0] = fi--;
        a[i][1] = fi--;
    }
    qsort(a,2, sizeof(char*), cmp);
    for (i = 0; i < 2; i++)
        printf("%c %c\n",a[i][0],a[1][1]);
}

注意cmp在这cmp中,使用的是strcmp(),看可以通过它,进行字典序的排序,从而达到对二位数组的排序,strcmp详细的用法可以百度一下。

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值