0


模拟实现qsort函数(C语言指针进阶学习)

文章目录


前言

最近刚学习完函数指针,为加深对函数指针的了解及进一步的掌握,写下本文记录使用函数指针等指针进阶相关知识模拟实现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语言的学习有很大帮助。以上代码,若有错误或更优写法,欢迎指点。

标签: c语言 学习

本文转载自: https://blog.csdn.net/weixin_66296893/article/details/126942722
版权归原作者 总要抱有期待. 所有, 如有侵权,请联系我们删除。

“模拟实现qsort函数(C语言指针进阶学习)”的评论:

还没有评论