【C语言】qsort函数

目录

简介

 头文件

​编辑 函数原型:

参数函数如何写:

参数函数要求:

qsort对整性数据的排序:

qsort对字符型数据的排序:

对结构体类型的内部元素排序:


函数的底层是以快速排序实现的 

【C语言】qsort函数_第1张图片

 但是本文不深入探讨快速排序是如何进行的,你可以从上面的动图可以有个大致了解。


 

一,简介

qsort函数(quick sort)是八大排序算法中的快速排序,能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型。 

 二,头文件

【C语言】qsort函数_第2张图片 三,函数原型:

void qsort (void* base,//要排序的对象的第一个元素的首地址
            size_t num, //对象的个数
            size_t size,//每一个对象的大小 Size in bytes
            int (*compar)(const void*,const void*));//Pointer to a function that compares two elements.(并且这个函数要自己写)

四,参数函数如何写:

【C语言】qsort函数_第3张图片

4.1参数函数要求:

必须与qsort函数的第四个参数的函数指针的类型相同

        两个参数是两个空类型的指针

        返回值为整形,对于元素来说:

        如果值小于0,第一个小于第二个;

        如果值等于0,第一个等于第二个;

        如果值大于0,第一个大于第二个;

(这些比较都是以你定义的函数为标准,而比较出来的)

五,具体实例

5.1 qsort对整性数据的排序:


//两个整形元素比较可以用><=来比较
int in_cmp(const void* a,const void* b)
{
	return *((int*)a) - *((int*)b);//void*不可直接解引用
}
int main1()
{
	int arr[8] = {5,8,9,4,3,2,8,1};
	qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),in_cmp);
	for(int i = 0;i < 8;i++)
	{
		printf("%d ",arr[i]);
	}
	
	return 0;
}

 着重点:

1.qsort函数第四个参数(函数指针的类型)与库函数完全一致;

2.传入的元素的个数,每个元素的大小都可以借助sizeof操作符实现;

3.其余注意写在代码注释中;

5.2 qsort对字符型数据的排序:


//比较两个字符,字符在内存中以ASCII、码存储,可用<>=比较

int ch_cmp(const void* ach,const void* bch)
{
	return *(char*)ach - *(char*)bch;//强制类型转化为char*
}
int main2()
{
	
	char *str = "hisndksni";//str为字符串常量,不能被改变
	char p[10];//可以创建字符数组,把str内容copy过来
	memcpy(p,str,10);
	int len = strlen(str);
	qsort(p,len,sizeof(char),ch_cmp);
	printf("%s",p);
	return 0;
}

 注重点:

1.对字符串排序,结尾的\0可忽略,所以可用strlen计算元素的个数;

2.字符串常量不能被改变,初始化时要注意;

5.3 对结构体类型的内部元素排序:


struct stu
{
	int score;
	char* name;
	int hight;
};

int stu_cmp_by_score(const void* p1,const void* p2)
{
	return ((struct stu*)p1)->score - ((struct stu*)p2)->score;
}
int main()
{
	struct stu arr[]= {{90,"zhangsan",175},{88,"lisi",180}};
	int sz1 = sizeof(arr)/sizeof(arr[0]);
	qsort(arr,sz1,sizeof(arr[0]),stu_cmp_by_score);
	for(int i = 0;i < sz1;i++)
	{
		printf("%d ",arr[i].score);
	}
	
	return 0;
}

 1.结构体指针写完整;

2.适当的用括号让自己的代码逻辑更加清晰;


cplusplus的qort函数icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstdlib/qsort/?kw=qsort


完~

未经作者同意禁止转载

你可能感兴趣的:(C进阶,c语言,数据结构)