c语言中qsort函数的用法及自建函数实现其功能

c语言中qsort函数的用法及自建函数实现其功能,第1张

文章目录
  • 前言
  • 一、qsort函数功能及用法
  • 二、使用步骤
    • 1.引入库
    • 2.qsort函数排序整形数组
    • 3.qsort函数排序浮点型数组
    • qsort函数按年龄排序结构体数组
    • qsort函数按名字排序结构体数组
  • 三、 自建qsort函数


前言

若是代码有什么问题或者大家有什么不理解的地方,欢迎随时来私信我

qsort函数在c语言中有着非常强大的作用,不仅可以排序整形数组、浮点型数组、 还可以排序结构体数组,
下面我将为大家详解qsort函数的用法,以及用自建函数如何实现qsort的功能

一、qsort函数功能及用法

功能:对一组数据进行排序
头文件:stdlib.h
用法如下:
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
void* base是要排序的数组名字,size_t num是数组有几个元素
size_t size是数组中每个元素的大小, int (compar)(const void,const void*是比较大小的函数

二、使用步骤 1.引入库

代码如下:

#include
#include
#include//后续strcmp函数需要用到
2.qsort函数排序整形数组

代码如下:

int cmp_int(const void *e1,const void*e2)
{
	return *(int*)e1-*(int*)e2;
	//void类型指针代表无符号,可以接收int类型和double类型,但是返回值需要强制转换为int*
	//此处用int*替换void*也可以,若是这样就不需要强制类型转换了
	//若e1>e2返回正数,把e1放e2后面,若e1
}
void test1()
{
	int i=0;
	int arr[10]={9,8,7,6,5,4,3,2,1,0};
	int sz=sizeof(arr)/sizeof(arr[0]);//计算数组元素个数,arr代表整个数组大小,arr[0]代表一个数组元素大小
	qsort(arr,sz,sizeof(arr[0]),cmp_int);
	//arr代表整个数组,sz代表数组中元素的个数
	//sizeof(arr[0])代表数组中每个元素占几个字节
	//cmp_int是我们写的比较大小的函数地址
	for(i=0;i<sz;i++)
	{
		printf("%d ",arr[i]);
	}
}
int main()
{
	test1();//排序整型数组
	return 0;
}

代码输出结果如下:

3.qsort函数排序浮点型数组

代码如下:

int cmp_float(const void *e1,const void *e2)
{
	return (int)(*(float*)e1-*(float*)e2);
	//若e1>e2返回正数,把e1放e2后面,若e1
}
void test2()
{
	float f[]={9.0f,8.0f,7.0f,6.0f,5.1f,4.2f,3.2f,2.2f,1.2f};
	int sz=sizeof(f)/sizeof(f[0]);
	qsort(f,sz,sizeof(f[0]),cmp_float);
	int i=0;
	for(i=0;i<sz;i++)
	{
		printf("%.1f   ",f[i]);
	}
}
int main()
{
	test2();//排序浮点型数组
	return 0;
}

代码输出结果如下:

qsort函数按年龄排序结构体数组

代码如下:

struct Stu//定义结构体数组
{
	char name[20];
	int age;
};
int cmp_stu_by_age(const void*e1,const void*e2)//通过年龄大小排序
{
	return((struct Stu*)e1)->age-((struct Stu*)e2)->age;
}
void test3()
{
	struct Stu s[3]={{"zhangsan",20},{"wangwu",18},{"lisi",19}};
	int sz=sizeof(s)/sizeof(s[0]);
	qsort(s,sz,sizeof(s[0]),cmp_stu_by_age);
	for(i=0;i<sz;i++)
	{
		printf("%s ",(&s[i])->age);
	}
}
int main()
{
	test3();
	return 0;
}

代码输出结果如下:

qsort函数按名字排序结构体数组
struct Stu//定义结构体数组
{
	char name[20];
	int age;
};
int cmp_stu_by_name(const void*e1,const void*e2)
{
	return strcmp(((struct Stu*)e1)->name,((struct Stu*)e2)->name);
	//使用strcmp函数需要引入库函数string,比较的是字符串首字符的ASCII值大小
}
void test4()
{
	struct Stu s[3]={{"zhangsan",20},{"wangwu",18},{"lisi",19}};
	int sz=sizeof(s)/sizeof(s[0]);
	qsort(s,sz,sizeof(s[0]),cmp_stu_by_name);
	for(i=0;i<sz;i++)
	{
		printf("%s ",(&s[i])->name);
	}
}
int main()
{
	test4();
	return 0;
}

代码输出结果如下:

三、 自建qsort函数

提示:自建qsort函数比较复杂,大家有什么不理解的欢迎随时提问
代码如下:

#include
struct Stu
{
	char name[20];
	int age;
};
void Swap(char* buf1,char*buf2,int width)
{
	int i=0;
	for(i=0;i<width;i++)
	{
		char tmp=*buf1;//按照一个字节一个字节访问,每次交换一个字节的值
		*buf1=*buf2;
		*buf2=tmp;
		buf1++;
		buf2++;
	}
}
void bubble_sort(void *base,int sz,int width,int(*cmp)(const void*e1,const void*e2))
{
	int i=0;
	for(i=0;i<sz-1;i++)
	{
		int j=0;
		for(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 cmp_int(const void *e1,const void *e2)//比大小函数与上述相同
{
	return *(int*)e1-*(int*)e2;
}
int cmp_stu_by_age(const void*e1,const void*e2)//结构体按照年龄大小排序
{
	return((struct Stu*)e1)->age-((struct Stu*)e2)->age;
}
void test4()//排序整形数组
{
	int arr[10]={9,8,7,6,5,4,3,2,1};
	int sz=sizeof(arr)/sizeof(arr[0]);
	bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
	for(i=0;i<sz;i++)
	{
		printf("%d ",arr[i]);
	}
}
void test5()//排序结构体-按照年龄升序
{
	struct Stu s[3]={{"zhangsan",20},{"wangwu",18},{"lisi",19}};
	int sz=sizeof(s)/sizeof(s[0]);
	bubble_sort(s,sz,sizeof(s[0]),cmp_stu_by_age);
	for(i=0;i<sz;i++)
	{
		printf("%s ",(&s[i])->age);
	}
}
int main()
{
	test4();
	test5();
	return 0;
}

输出结果与上述qsort函数相同,大家可选择相对应的函数自行尝试

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/716944.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存