【C语言】qsort()函数排序及其模拟实现,万物皆可排!

发布于:2024-04-18 ⋅ 阅读:(39) ⋅ 点赞:(0)

🔥博客主页🔥:【 坊钰_CSDN博客 】

欢迎各位点赞👍评论✍收藏⭐

目录

 1. 函数介绍

 2. qsort举例排列整型变量

3. qsort举例排列结构型变量

3.1 按名字排序

3.1.1  srtcmp函数

3.2 按年龄排序

4. qsort函数模拟实现(采用冒泡的方式)

5. 小结


 1. 函数介绍

void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));

可以看到qsort函数有四种参数,我们来一一解释:

1. void* base

指向要排序的数组的第一个对象的指针,转换为 void*,通俗来讲就是数组首元素地址;

2. size_t num

数组中指向的元素个数;

3. size_t size

数组中每个元素的大小(以字节为单位);

4. int (*compar)(const void*,const void*)

指向比较两个元素的函数的指针。
此函数通过比较两个元素反复调用。它应遵循以下原型:

将两个指针作为参数(都转换为 const void*)。该函数通过返回(以稳定和传递的方式)定义元素的顺序:

注意:qsort函数无返回值;

 2. qsort举例排列整型变量

#include <stdio.h>


int cmp_imp(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

int main()
{
	int arr[] = { 2,3,4,1,5,7,6,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_imp);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(arr + i));
	}
	return 0;
}

3. qsort举例排列结构型变量

这是一个结构体

struct Student
{
	char name[100];
	int age;
};

3.1 按名字排序

这个用到了strcmp函数

3.1.1  srtcmp函数

int strcmp ( const char * str1, const char * str2 )

 返回值

 代码:

#include <stdio.h>

struct Student
{
	char name[100];
	int age;
};

void cmp_srt_imp(const void* p1, const void* p2)
{
	return strcmp(((struct Student*)p1)->name , ((struct Student*)p2)->name);
}

int main()
{
	struct Student arr[3] = { {"zhangsan",18},{"lisi",20},{"wangwu",19}};
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_srt_imp);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d ", arr[i]);
	}
	return 0;
}

3.2 按年龄排序

struct Student
{
	char name[100];
	int age;
};

void cmp_srt_imp(const void* p1, const void* p2)
{
	return ((struct Student*)p1)->age - ((struct Student*)p2)->age;
}

int main()
{
	struct Student arr[3] = { {"zhangsan",18},{"lisi",20},{"wangwu",19} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_srt_imp);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d ", arr[i]);
	}
	return 0;
}

4. qsort函数模拟实现(采用冒泡的方式)

用这样的方式qsort函数可排列任意的数据类型

代码:

#include <stdio.h>

//仿qsort函数重写冒泡排序

int cmp(const void* p1, const void* p2)     //所选择的比较方法
{
	return (*(int*)p1 - *(int*)p2);
}



void cmp_swap(char* p1, char* p2,int width)     //实现数组元素的交换
{
	for (int i = 0; i < width; i++)
	{
		int ret = *p1;
		*p1 = *p2;
		*p2 = ret;
		p1++;
		p2++;
	}
}


void bubble(void* base, int sz, int width, int (*cmp)(const void* p1, const void* p2))
{
	for (int i = 0; i < sz - 1; i++)   //冒泡排序趟数
	{
		for (int j = 0; j < sz - i - 1; j++)     //每一趟冒泡排序
		{
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width )> 0)
			{
                  //符合条件进行交换
				cmp_swap(((char*)base+j*width), ((char*)base + (j+1) * width),width);
			}
		}
	}
}


int main()
{
	int arr[] = { 2,1,3,5,6,4,7,9,8,10 };       //定义整型数组并初始化
	int sz = sizeof(arr) / sizeof(arr[0]);      //计算数组长度
	bubble(arr,sz,sizeof(arr[0]),cmp);           //模拟qsort函数实现冒泡排序
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

5. 小结

以上就是关于qsort函数的内容了,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持!