前几天在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 }