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

文章目录

  • 前言
    • 最近刚学习完函数指针,为加深对函数指针的了解及进一步的掌握,写下本文记录使用函数指针等指针进阶相关知识模拟实现C语言库函数qsort函数。
  • 一、qsort函数声明
  • 二、模拟实现qsort函数
    • 1.自定义一个My_qsort函数
    • 2.实现比较函数与交换函数
    • 3.主函数示例
    • 附上字符或字符串比较函数
    • 完整代码示例(以整型数组为例)
  • 总结


前言

最近刚学习完函数指针,为加深对函数指针的了解及进一步的掌握,写下本文记录使用函数指针等指针进阶相关知识模拟实现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函数

代码如下:

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所需参数应为序排列数组的首元素地址与下一元素地址。

2.实现比较函数与交换函数

代码如下(这里以整形数组示例):
//整形数组比较函数代码

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*)类型的指针,细致到在内存中的每一个字节进行交换,增强函数通用性

3.主函数示例

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;
}

排序代码执行后结果:
模拟实现qsort函数(C语言指针进阶学习)_第1张图片

附上字符或字符串比较函数

代码如下:

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语言的学习有很大帮助。以上代码,若有错误或更优写法,欢迎指点。

你可能感兴趣的:(c语言,学习)