《算法零基础100讲》(第41讲) C语言 排序 API (qosrt)【学习总结】

今天学习的C语言自带的排序函数qosrt,这个函数的功能非常强大的,能够将给定序列按照我们要求的方式排序。

一、qosrt原型

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

 一共四个参数(挺多的哈),前面三个参数理解起来不是很难,分别是待排序序列的起始地址、待排序序列的元素个数和每个元素的大小

 第四个参数是一个函数,功能是比较两个元素

int (*cmp)(const void * , const void *);

返回类型是 整形int ,cmp是函数名,函数有两个形参 。可以说是指向常数的“万能”的指针,

我们可以通过强制类型转换变成任意类型的指针。

二、使用步骤

1.对整形数组排序

代码如下(示例):

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a,const void *b){
	return *(int*)a > *(int*)b;        //对于*(int*)a,这样解读 首先(int*)将a转化成一个整形指针,然后再解引用a  
			//如果要从大到小排序 这里比较就用 <                                   
}

void Print(int nums[],int numsSize){
	int i;
	for(i=0; i<numsSize; ++i)
		printf("%d ",nums[i]);
	printf("\n");
}

int main(void)
{
	int array[8] = {2,98,53,89,111,1234,-89,0};
	printf("\n排序前:"); 
	Print(array,8);                        //打印排序前的结果
	qsort(array,8,sizeof(int),cmp);        //调用排序函数对array进行排序
	printf("\n排序后:");
	Print(array,8);                        //打印排序前的结果

return 0;
}

 

 

2.对字符串进行排序

代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a,const void *b){
	char *s1 = (char*)a,*s2 = (char*)b;
	return strcmp(s1,s2);                         
}

void Print(char nums[5][20],int numsSize){
	int i;
	for(i=0; i<numsSize; ++i)
		printf("%s ",nums[i]);
	printf("\n");
}

int main(void)
{
	char array[5][20] = {"apple","orange","pear","banana","peach"};
	printf("\n排序前:"); 
	Print(array,5);                        //打印排序前的结果
	qsort(array,5,sizeof(array[0]),cmp);        //调用排序函数对array进行排序
	printf("\n排序后:");
	Print(array,5);                        //打印排序前的结果

return 0;
}

 

 

 3.对结构体排序

#include <stdio.h>
#include <stdlib.h>
struct competitor{
	int score1;
	int score2;
};
int cmp(const void *a,const void *b){
	struct competitor *p1,*p2;
	p1 = (struct competitor*)a;
	p2 = (struct competitor*)b;
	if(p1->score1 != p2->score1)
		return p1->score1 < p2->score1;			//如果第一次成绩不同比较第一次成绩 否则比较第二次成绩 
	else
		return p1->score2 < p2->score2;
}

void Print(struct competitor test[],int numsSize){
	int i;
	for(i=0; i<numsSize; ++i){
		printf("(%d,%d) ",test[i].score1,test[i].score2);
	}
	printf("\n");
}

int main(void)
{
	struct competitor test[3] = {
		{5,6},{5,7},{9,2}
	};
	printf("\n排序前:"); 
	Print(test,3);                       		 		//打印排序前的结果
	qsort(test,3,sizeof(struct competitor),cmp);        //调用排序函数对array进行排序
	printf("\n排序后:");
	Print(test,3);                       				 //打印排序前的结果

return 0;
}

 

当然还有更多的排序方式比如,按奇偶进行排序

int Qua(int x) {
    return x % 2;
}
int cmp(const void *a, const void *b) {
    return Qua(*(int *)a) - Qua(*(int *)b);
}

 


总结

qosrt作为一个快捷排序的函数是很方便的、不然每次写个题,还要擦擦擦的先写个排序,那多麻烦阿。最重要的还是比较方式,不同的比较方式,就能实现不一样的排序结果。

今天打卡完成!!!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周日加一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值