最近笔者又浅学关于qsort函数的排序方法!下面且听笔者一一道来!
不知道大家对于qsort函数了解多少!可能仅仅限制在qsort函数是快速排序的函数,至于其他的就……额,不知道了!下面请看笔者对于qsort函数的讲解!但也不敢保懂!!
下面笔者是参考部分文献得来的内容!敬请欣赏:
qsort void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
对数组的元素进行排序
对 所指向的数组元素进行排序,每个元素的长度为长,使用函数确定顺序。
此函数使用的排序算法通过调用指定函数并指向元素的指针作为参数来比较元素对。
该函数不返回任何值,但通过对所定义的数组元素进行重新排序来修改所指向的数组的内容。
原文内容为:
对于qsort我们在上面考研看出来,返回值为void 类型,即:可以排序(大小排序)任意类型的数据!
下面笔者就定义:进行简单的讲解!!
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
1.void* base :指向待排序数组的起始位置!
2.size_t num :待排序数组的元素个数!
3.size_t size :(所占字节)待排序数组的元素大小!
4.int (*compar)(const void*,const void*)) 这个就需要我们好好进行分析一下!
我们可以将int (*compar)(const void*,const void*)) 进行分开处理!
int (*compar)(const void*,const void*))
函数: (const void*,const void*)
指针: *compar
返回类型: int
因此,对于int (*compar)(const void*,const void*)) ,我们可以概述为:比较两个元素大小的函数指针!
回想一下:对于不同的数据类型,有着不同的比较方式!所以……qsort显现出来独一无二的作用!
对于两个整型,运用关系运算符进行比较大小(>,<);
对于两个字符串,使用库函数strcmp进行比较大小;
对于两个结构体,也得制定比较方式!
因此我们可以用qsort函数来进行……比较 !
下面请看笔者用qsort函数测试排序整型数组!请看代码!
#include <stdlib.h> #include <stdio.h> void print(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("\n"); } int cmp_int(const void* e1, const void* e2) { if (*(int*)e1 > *(int*)e2) return 1; else if (*(int*)e1 < *(int*)e2) return -1; else return 0; } void test2() { int arr[] = { 2,1,3,7,5,9,6,8,0,4 }; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(arr[0]), cmp_int); print(arr, sz); //打印 } int main() { test2(); return 0; }
对于上述代码,笔者只对最重要的那一部分进行简单讲解!请读者注意一下!!显而易见的就是该段代码:
int cmp_int(const void* e1, const void* e2) { if (*(int*)e1 > *(int*)e2) return 1; else if (*(int*)e1 < *(int*)e2) return -1; else return 0; }
对于: *(int*)e1 与 *(int*)e2; 我们再定义e1与 e2的时候,是定义的void(空类型),所以在使用之前,先将e1与 e2通过 (int*)e1 与 (int*)e2 强制类型转换为: int* 类型!然后在进行解引用操作!
对于在该段代码里面的 if 语句的内容,可以更改为:retrun (*(int*)e1 - *(int*)e2); (升序)(要是想要降序,则可以对调一下)
原因在于:
qsort函数的返回值为int整型!!
对于上述代码的运行结果为:
对于这篇文章,笔者所写内容大致到此结束!!有不同想法的读者请与笔者进行私聊!!
感激!!