Leecode刷题C语言之根据第k场考试的分数排序

发布于:2024-12-22 ⋅ 阅读:(42) ⋅ 点赞:(0)

执行结果:通过

执行用时和内存消耗如下:

 

 

 

 

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列)进行排序。这个二维数组由指针数组构成,其中每个指针指向一个整数数组,代表一个学生的分数。下面是对代码的详细解题思路:

  1. 定义全局变量
    • int gk = 0;:这个全局变量用于存储需要排序的列索引(即第k列)。在compare函数中,它将决定基于哪一列的值进行比较。
  2. 定义比较函数
    • 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。这决定了排序的顺序(升序)。
  3. 定义排序函数
    • 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;:返回排序后的二维数组。由于是在原数组上进行排序,所以直接返回输入数组。
  4. 整体流程
    • 调用sortTheStudents函数时,传入学生分数表(二维数组)、表的大小、每行的列数、需要排序的列索引k,以及两个用于接收输出结果的指针。
    • 函数内部通过修改全局变量gk来指定排序的列,然后调用qsort函数进行排序。
    • 排序完成后,函数通过输出参数返回排序后数组的大小和每行的列数,并返回排序后的数组(实际上是原数组,但元素顺序已改变)。


网站公告

今日签到

点亮在社区的每一天
去签到