目录
前言
一、qosrt原型
二、使用步骤
1.对整形数组排序
2.对字符串进行排序
3.对结构体排序
总结
前言
今天学习的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作为一个快捷排序的函数是很方便的、不然每次写个题,还要擦擦擦的先写个排序,那多麻烦阿。最重要的还是比较方式,不同的比较方式,就能实现不一样的排序结果。
今天打卡完成!!!
更多推荐
《算法零基础100讲》(第41讲) C语言 排序 API (qosrt)【学习总结】
发布评论