前几天在leetcode上刷题,用qsort对二维数组进行排序,发现不会写qsort的比较函数。后面在网上找了几篇博客才弄明白,趁今天有空,对这个做一下总结,主要是以下4个方面:

1、qsort总体介绍

2、qsort应用于一维数组

3、qsort应用于指针数组

4、qsort应用于二维数组

 

1、qsort总体介绍

  函数声明:void qsort(void *base, size_t nitems, size_t size, int (*compare)(const void *, const void*))

  参数解释:

    base-- 指向要排序的数组的第一个元素的指针。注意这里说是数组,所以必须是对连续的内存块进行排序。

    nitems-- 由 base 指向的数组中元素的个数

    size-- 数组中每个元素的大小,以字节为单位

    compare-- 用来比较两个元素的函数。这是qsort最难的一部分了。这里主要要注意以下2点:1、在写compare函数时,你的两个形参必须是const void *型,但是在compare函数内部你又必须将const void *类型的形参转换为实际的类型。这是我最当时最难以理解的一个问题了:我需要转换成什么类型。看了别人的总结才知道,是:指向数组元素的指针,指向数组元素的指针,指向数组元素的指针。重要的事情说三遍。具体怎么理解,会在下面的例题中详细讲,我认为这时理解qsort的一个纲领。2、comapre函数的返回值是int,即整型。记住这一点,当你在比较double类型时就不会出错了。如果返回的是一个正数。说明第一个参数排在第二个参数的后面,如果是一个负数,说明第一个参数排在第二个参数的前面。如果等于零,说明它们两是相等的,谁先谁后都没关系。

 

 

2、qsort应用于一维数组 

2.1、一维整型数组的用法

  举例: 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int compare(const void *p1, const void *p2) {
 5 
 6     return (*(int *)p1) - (*(int *)p2); // 升序排序
 7     //return (*(int *)p2) - (*(int *)p1); // 降序排序
 8 }
 9 
10 int main(int argc, char** argv)
11 {
12     int i;
13     int arr[5] = { 13, 17, 2, 7, 71 };
14     printf("Before qsort: ");
15     for (i = 0; i < 5; i++) {
16         printf("%d ", arr[i]);
17     }
18     printf("\n");
19 
20     qsort(arr, sizeof(arr)/sizeof(arr[0]), sizeof(arr[0]), compare);
21     printf("After qsort: ");
22     for (i = 0; i < 5; i++) {
23         printf("%d ", arr[i]);
24     }
25     printf("\n");
26     return 0;
27 }
View Code

相关文章:

  • 2022-12-23
  • 2021-12-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-03
  • 2021-12-06
  • 2022-01-02
  • 2022-12-23
  • 2021-12-09
  • 2022-12-23
相关资源
相似解决方案