- qsort可以排列任意类型的数据,对与qsort来说,它的使用方面就比较多,比如;1.使用qsort函数排序整形数据。2.使用qsort排序结构数据。3.qsort函数的模拟实现。
- 它的基本写法为:qsort(void*base,(//指针,指向的是待排序数组第一元素) size_num,(数组元素个数) size_t size(//数组的元素大小) int(*compar)(const void*p1,cost void*p2)(//函数指针--指向就是两个元素的比较函数));看着比较多,但很好理解。
- 好的,首先我们来讲一讲1.使用qsort函数排序整形数据:大家都知道冒泡排序,我在前面也讲过冒泡排序,那是用一个bubble_sort这个函数来写的,比较麻烦,那么我们现在就用qsort来写一个冒泡排序,首先,还是把主函数写出来,代码为:
int main() { int arr[] = {1,3,2,4,5,8,9,6}; int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; qsort(arr, sz, sizeof(arr[0]), int_cmp);//这个就是利用qsort来写的 for (i = 0; i < sz; i++) { printf("%d", arr[i]); } printf("\n"); return 0; }
然后,对qsort进行声明,来实现对qsort的使用,则代码为:
int int_cmp(const void*p1,const void*p2) { if (*(int*)p1 > *(int*)p2) return 1; else if (*(int*)p1 == *(int*)p2) return 2; else return -1; }
这样就呢个把代码写出来了,其实qsort函数的代码也可以简化,不需要这么麻烦,可以把{}里的数改写成
int int_cmp(const void* p1, const void* p2) //还可以改写成这样 { return (*(int*)p1 - *(int*)p2); }
是不是就简单了很多,这是因为做差就可以包含了其它的程序。这样是不是比用一般函数代码所用的代码少了很多,而且简单,明了。
-
再来讲一讲2.使用qsort排序结构数据。这里就要用一下数组的知识了,我们要用一下前面所讲的结构体,你还知道吗?回想一下吧,结构数据:排列学生的名字和年龄,并输出。一样的,先创造一个结构体,用struct来创造,代码为:
struct stu //学生 { char name[20]; int age; };
然后,创造一个主函数,代码为:
int main() { test1();//用来年龄的排序 test2();//用来名字的排序 return 0; }
然后,就是排序,在这里我们就不一一介绍了,我们全写出来,在慢慢分析,所对应的代码为:
#include<string.h> //按照年龄先作比较 int com_sture_age(const void* p1, const void* p2) { return ((struct stu*)p1 - (struct stu*)p2);//作差 } //再按照名字来作比较,但作名字时,要用到字符串作比较的特殊库函数:strcmp, //strcmp的头文件为:<string.h> int com_sture_name(const void* p1, const void* p2) { return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name); } //按照年龄来排序的 void test1() { struct stu age[] = { 20,30,16 }; int sc1 = sizeof(age) / sizeof(age[0]); int j = 0; for (j = 0; j < sc1; j++) qsort(age, sc1, sizeof(age[0]), com_sture_age); printf("%zd\n", age[j]); } //按照名字来排序的 void test2() { struct stu name[] = { {"zhangsan"},{"lizi"},{"wangwu"},{"zhoasi"}}; int sc2 = sizeof(name) / sizeof(name[0]); int i = 0; for (i = 0; i < sc2; i++) qsort(name, sc2, sizeof(name[0]), com_sture_name); printf("%zd\n", name[i]); }
这个就是所对应的代码,虽然很长,但是很通俗易懂,就是理解qsort的使用
-
最后来讲讲3.qsort函数的模拟实现,在这里还是要采用冒泡排序的方法来实现它。(在这里要使用void*的指针,)还是先把主函数写出来,则代码为:
int main() { int arr[] = { 1,3,2,4,5,8,9,6 }; int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; bubble(arr, sz, sizeof(arr[0]), int_comp);//用bubble创建一个函数模拟qsort for (i = 0; i < sz; i++) { printf("%d", arr[i]); } printf("\n"); return 0; }
接下来就是对bubble进行声明,代码为:
void bubble(void* base,int count,int size,int(*cmp)(void *,void *))//函数指针回调 { int i = 0; int j = 0; for (i = 0; i < count - 1; i++) { for (j = 0; j < count - 1; j++) { if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0) { _swap((char*)base + j * size, (char*)base + (j + 1) * size, size); } } } }
函数指针回调的上一章的内容了。不知道的可以往前看一看,对于接下来的操作就是对_swap和int_cmp的声明,两个代码一起写,则代码为:
int int_comp(const void*p1,const void*p2) { return (*(int*)p1 - *(int*)p2); } void _swap(void* p1, void* p2, int size) { int i = 0; for (i = 0; i < size; i++) { char tmp = *((char*)p1 + 1); *((char*)p1 + 1) = *((char*)p2 + 1); *((char*)p2 + 1) = tmp; } }
这样就能很好的用回调函数,模拟实现qsort。
-
以上三种就是理解好qsort的最好证明了。看似很复杂,其实也不简单,慢慢品味吧。
qsort使用举例(qsort函数的模拟实现)
最新推荐文章于 2024-05-12 02:05:30 发布