文章目录
前言
最近刚学习完函数指针,为加深对函数指针的了解及进一步的掌握,写下本文记录使用函数指针等指针进阶相关知识模拟实现C语言库函数qsort函数。
一、qsort函数声明
要想模拟实现该函数,先了解该函数声明,以下是函数声明:
**void qsort(void base, size_t nitems, size_t size, int (compar)(const void , const void))
其各个形参意义:
base:指需要排列的数组首元素的指针
nitems:指指向的数组元素个数
size:指该数组每个元素的大小(字节)
compar:用来比较两个元素的函数
注:这里的比较函数需要自定义实现
二、模拟实现qsort函数
1.自定义一个My_qsort函数
代码如下:
voidMy_qsort(void* base,int sz,int width,int(*cmp)(constvoid* e1,constvoid* e2)){for(int i =0; i < sz -1; i++){for(int j =0; j < sz -1- i; j++){if(cmp(constvoid* e1,constvoid* e2)>0)//if语句判断是否满足交换条件{swap(参数);//交换函数//如果满足条件,则进行交换。}}}}
此处的swap所需参数应为序排列数组的首元素地址与下一元素地址。
2.实现比较函数与交换函数
代码如下(这里以整形数组示例):
//整形数组比较函数代码
intint_cmp(constvoid* e1,constvoid* e2){return*(int*)e1 -*(int*)e2;}
//由于e1与e2是无类型指针,此处进行计算先用(int*)强制转换成整形指针后再进行解引用再计算
//计算后返回一个大于0或小于0或等于0的整形到My_qsort函数进行条件判断;
//交换函数代码及其思路
voidswap(char* buf1,char* buf2,int width){char tmp =0;for(int i =0; i < width; i++){
tmp =* buf1;* buf1 =* buf2;* buf2 = tmp;
buf1++;
buf2++;}}
// 这里使用(char*)类型的指针,细致到在内存中的每一个字节进行交换,增强函数通用性
3.主函数示例
intmain(){int arr[]={8,0,6,9,7,2,4,1,3,5};int sz =sizeof(arr)/sizeof(arr[0]);My_qsort(arr, sz,sizeof(arr[0]), int_cmp);for(int i =0; i < sz; i++){printf("%d ", arr[i]);}return0;}
排序代码执行后结果:
附上字符或字符串比较函数
代码如下:
intchar_cmp(constvoid* e1,constvoid* e2){returnstrcmp(*(char*)e1,*(char*)e2);}
注意:此处使用了strcmp函数,记得引头文件string.h
完整代码示例(以整型数组为例)
代码如下:
#include<stdio.h>voidswap(char* buf1,char* buf2,int width){char tmp =0;for(int i =0; i < width; i++){
tmp =*buf1;*buf1 =*buf2;*buf2 = tmp;
buf1++;
buf2++;}}intint_cmp(constvoid* e1,constvoid* e2){return*(int*)e1 -*(int*)e2;}voidMy_qsort(void* base,int sz,int width,int(*cmp)(constvoid* e1,constvoid* e2)){for(int i =0; i < sz -1; i++){for(int j =0; j < sz -1- i; j++){if(cmp((char*)base + j * width,(char*)base +(j +1)* width)>0){swap((char*)base + j * width,(char*)base +(j +1)* width,width);}}}}intmain(){int arr[]={8,0,6,9,7,2,4,1,3,5};int sz =sizeof(arr)/sizeof(arr[0]);My_qsort(arr, sz,sizeof(arr[0]), int_cmp);for(int i =0; i < sz; i++){printf("%d ", arr[i]);}return0;}
总结
作为一个C语言初学者,通过模拟实现库函数qsort加深了自己对指针的了解,更快地学会使用函数指针等知识,对C语言的学习有很大帮助。以上代码,若有错误或更优写法,欢迎指点。
版权归原作者 总要抱有期待. 所有, 如有侵权,请联系我们删除。