目录
引言
让我们设想一种情景,当你遇到一些相关联的数时,如
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;
}