二维数组的排序问题

目录

引言

正文

分析

比较函数compar

具体实现


引言

让我们设想一种情景,当你遇到一些相关联的数时,如

3 1 2

1 2 5

6 8 4

3 5 1

6 5 4

7 8 9

....

你想让这个二维数组按照第一列或者第二列或第三列排序时,该如何实现呢?

正文

分析

首先提高排序 ,我们首选应该想到的是qsort()这个排序函数。

void qsort (void *base,size_t num,size_t size, int(*compar)(const void*,const void*))

base 是整个数组的指针

num 是数组元素的个数

size 是数组每个元素的大小

compar 是比较函数

假设数组是arr[n][m]

因为每一行是按照一个整体去排序的,所以每个元素的大小是arr[0]

元素个数 sizeoof(arr)/arr[0]

下面就是最重要的比较函数

比较函数compar

int compar(const void* row1, const void* row2)//接受的是每一行的首元素地址
{
	int n1 = *((const int*)row1 + 1*4);//加4代表的就是第n行第2个元素,以此类推
    int n2 = *((const int*)row2 + 1*4);
    return n1 - n2;
}

具体实现

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

// 比较函数,用于 qsort 排序
int compare(const void* row1, const void* row2)
{
    const int* arr1 = (const int(*)[2])row1;//使其强制类型转化为数组
    const int* arr2 = (const int(*)[2])row2;
    return arr1[1] - arr2[1];
}

int main() 
{
    int n = 3, i, j;
    // 读取二维数组的行数
    printf("请输入二维数组的行数:");
    scanf("%d", &n);

    // 声明二维数组
    int arr[n][2]; // 二维数组的每行有两列

    for (i = 0; i < n; i++) {
        for (j = 0; j < 2; j++) {
            scanf("%d", &arr[i][j]);
        }
    }

    // 使用 qsort 函数按照第二列整数大小排序
    qsort(arr, n, sizeof(arr[0]), compare);

    // 打印排序后的二维数组
    printf("排序后的二维数组:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < 2; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

​

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值