使用qsort函数对二维数组排序

本文介绍了两种对二维数组进行排序的方法。方式一是直接在定义数组的函数中完成排序,适用于静态定义的二维数组;方式二是通过参数传入动态分配的二维数组并在函数内部进行排序。排序依据为数组的第二列,采用升序排列。示例代码中使用了`qsort`函数,并展示了排序后的结果。
//方式一:数组定义与排序在同一个函数中,主要针对直接定义的二维数组
int cmp6(const void *a, const void *b) {
    int *p1 = (int *)a;
    int *p2 = (int *)b;
    return p1[1] < p2[1] ? -1 : 1;   //按照第二列的值进行升序排序
}

int main(void)
{
    int points[4][2] = {{10,16},{2,8},{1,6},{7,12}};
    qsort(points, 4, sizeof(int) * 2, cmp6);
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 2; j++) {
            printf("%d ", points[i][j]);
        }
        printf("\n");
    }
}

//方式二:二维数组通过参数传入,在函数内排序,主要针对malloc得来的二维数组
int cmp5(const void *a, const void *b) {
    int *p1 = *(int **)a;
    int *p2 = *(int **)b;
    return p1[1] < p2[1] ? -1 : 1; 
}

int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){
    if (!pointsSize) return 0;
    qsort(points, pointsSize, sizeof(int *), cmp5);
    int pos = points[0][1];
    int ans = 1;
    for (int i = 0; i < pointsSize; ++i) {
        if (points[i][0] > pos) {
            pos = points[i][1];
            ++ans;
        }
    }
    return ans;
}

### 使用 `qsort` 对二维数组进行排序 在 C 语言中,`qsort` 函数可以用于对一维数组、结构体数组以及二维数组等数据结构进行排序。对于二维数组排序,需要明确按照何种规则进行排序(例如按行排序、按列排序或按特定元素值排序)。以下是一个完整的示例,展示如何使用 `qsort` 对二维数组进行排序。 #### 示例代码:按二维数组的第一列元素升序排序 ```c #include <stdio.h> #include <stdlib.h> #define ROW 5 #define COL 3 // 定义比较函数,按二维数组第一列元素升序排序 int compare(const void *a, const void *b) { // 将二维数组的行指针转换为 int 指针 int *row1 = (*(int **)a); int *row2 = (*(int **)b); // 比较两行的第一列元素 if (row1[0] > row2[0]) { return 1; } else if (row1[0] < row2[0]) { return -1; } else { return 0; } } int main(void) { // 定义二维数组 int array[ROW][COL] = { {3, 2, 5}, {1, 9, 4}, {7, 8, 6}, {0, 1, 2}, {4, 3, 7} }; // 动态分配一个指针数组,指向二维数组的每一行 int *ptr[ROW]; for (int i = 0; i < ROW; i++) { ptr[i] = array[i]; } // 使用 qsort二维数组进行排序 qsort(ptr, ROW, sizeof(int *), compare); // 输出排序后的二维数组 printf("Sorted 2D Array:\n"); for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { printf("%d ", ptr[i][j]); } printf("\n"); } return 0; } ``` #### 代码解析 1. **定义二维数组**:通过宏定义 `ROW` 和 `COL`,方便调整数组大小。 2. **动态指针数组**:创建一个指针数组 `ptr`,指向二维数组的每一行[^4]。 3. **比较函数**:`compare` 函数接收两个 `void*` 类型参数,并将其转换为指向二维数组行的指针。通过比较第一列元素实现升序排序。 4. **调用 `qsort`**:将指针数组传递给 `qsort` 函数,完成排序操作。 5. **输出结果**:遍历排序后的二维数组并打印。 #### 注意事项 - 如果需要按其他列排序,只需修改比较函数中的索引值即可。例如,按第二列排序时,将 `row1[0]` 和 `row2[0]` 替换为 `row1[1]` 和 `row2[1]`。 - 若需降序排序,可调整比较函数的返回值逻辑,将 `1` 和 `-1` 的位置互换[^3]。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值