执行结果:通过
执行用时和内存消耗如下:
int gk = 0;
int compare(const void* a, const void* b) {
int* ua = *(int**)a;
int* ub = *(int**)b;
return ub[gk] - ua[gk];
}
int** sortTheStudents(int** score, int scoreSize, int* scoreColSize, int k, int* returnSize, int** returnColumnSizes) {
gk = k;
qsort(score, scoreSize, sizeof(int*), compare);
*returnSize = scoreSize;
*returnColumnSizes = scoreColSize;
return score;
}
解题思路:
这段代码的主要目的是对一个二维数组(模拟一个学生分数表)按照指定的列(第k列)进行排序。这个二维数组由指针数组构成,其中每个指针指向一个整数数组,代表一个学生的分数。下面是对代码的详细解题思路:
- 定义全局变量:
int gk = 0;
:这个全局变量用于存储需要排序的列索引(即第k列)。在compare
函数中,它将决定基于哪一列的值进行比较。
- 定义比较函数:
int compare(const void* a, const void* b)
:这个函数是qsort
函数需要的比较函数,用于比较两个元素。在这个场景中,它比较的是两个整数数组的特定列(第k列)的值。int* ua = *(int**)a;
和int* ub = *(int**)b;
:这两行代码将void*
类型的参数转换为int**
类型,然后解引用为int*
,得到指向两个整数数组的指针。return ub[gk] - ua[gk];
:根据第k列的值对两个数组进行比较。如果ub[gk]
大于ua[gk]
,则返回正数;如果小于,则返回负数;如果相等,则返回0。这决定了排序的顺序(升序)。
- 定义排序函数:
int** sortTheStudents(int** score, int scoreSize, int* scoreColSize, int k, int* returnSize, int** returnColumnSizes)
:这个函数接收一个二维数组(学生分数表)、数组的大小、每行的列数、需要排序的列索引k,以及两个输出参数(排序后数组的大小和每行的列数)。gk = k;
:将全局变量gk
设置为需要排序的列索引k。qsort(score, scoreSize, sizeof(int*), compare);
:使用qsort
函数对二维数组进行排序。score
是待排序的数组,scoreSize
是数组的大小,sizeof(int*)
是数组中每个元素的大小(即指向整数数组的指针的大小),compare
是比较函数。*returnSize = scoreSize;
:设置输出参数returnSize
为排序后数组的大小(与输入数组相同)。*returnColumnSizes = scoreColSize;
:设置输出参数returnColumnSizes
为每行的列数,这里直接复用输入参数scoreColSize
的地址,因为排序不会改变每行的列数。return score;
:返回排序后的二维数组。由于是在原数组上进行排序,所以直接返回输入数组。
- 整体流程:
- 调用
sortTheStudents
函数时,传入学生分数表(二维数组)、表的大小、每行的列数、需要排序的列索引k,以及两个用于接收输出结果的指针。 - 函数内部通过修改全局变量
gk
来指定排序的列,然后调用qsort
函数进行排序。 - 排序完成后,函数通过输出参数返回排序后数组的大小和每行的列数,并返回排序后的数组(实际上是原数组,但元素顺序已改变)。
- 调用