要想模拟实现该函数,先了解该函数声明,以下是函数声明:
**void qsort(void base, size_t nitems, size_t size, int (compar)(const void , const void))
其各个形参意义:
base:指需要排列的数组首元素的指针
nitems:指指向的数组元素个数
size:指该数组每个元素的大小(字节)
compar:用来比较两个元素的函数
注:这里的比较函数需要自定义实现
代码如下:
void My_qsort(void* base, int sz, int width, int (*cmp)(const void* e1,const void* e2))
{
for (int i = 0; i < sz - 1; i++)
{
for (int j = 0; j < sz - 1 - i; j++)
{
if (cmp(const void* e1,const void* e2) > 0)
//if语句判断是否满足交换条件
{
swap(参数);//交换函数
//如果满足条件,则进行交换。
}
}
}
}
此处的swap所需参数应为序排列数组的首元素地址与下一元素地址。
代码如下(这里以整形数组示例):
//整形数组比较函数代码
int int_cmp(const void* e1, const void* e2)
{
return * (int*)e1 - * (int*)e2;
}
//由于e1与e2是无类型指针,此处进行计算先用(int*)强制转换成整形指针后再进行解引用再计算
//计算后返回一个大于0或小于0或等于0的整形到My_qsort函数进行条件判断;
//交换函数代码及其思路
void swap(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*)类型的指针,细致到在内存中的每一个字节进行交换,增强函数通用性
int main()
{
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]);
}
return 0;
}
代码如下:
int char_cmp(const void* e1, const void* e2)
{
return strcmp(*(char*)e1, *(char*)e2);
}
注意:此处使用了strcmp函数,记得引头文件string.h
代码如下:
#include
void swap(char* buf1, char* buf2,int width)
{
char tmp = 0;
for (int i = 0; i < width; i++)
{
tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
int int_cmp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void My_qsort(void* base, int sz, int width, int (*cmp)(const void* e1,const void* 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);
}
}
}
}
int main()
{
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]);
}
return 0;
}
作为一个C语言初学者,通过模拟实现库函数qsort加深了自己对指针的了解,更快地学会使用函数指针等知识,对C语言的学习有很大帮助。以上代码,若有错误或更优写法,欢迎指点。