首页 > 其他分享 >C语言库函数qsort的使用

C语言库函数qsort的使用

时间:2023-01-25 13:01:38浏览次数:39  
标签:const struct int void qsort C语言 sizeof 库函数

前言

qsort是C语言的库函数,使用前需包含头文件#include<stdlib.h>,函数原型是

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );它的功能是对不同数据的快速排序

一、参数解释

1.void *base

前言里说到,qsort函数可以对不同数据类型的数据快速排序,因此base接收的是排列元素的首地址,void*可以理解为元素可以是任一类型的指针

2.size_t num

该参数表示排列元素的个数

3.size_t width

表示每个元素所占字节大小

4.int (__cdecl *compare )(const void *elem1, const void *elem2 )

该参数是一个函数指针,指向的是两个函数参数是 const void*类型,返回类型为int的函数,该函数被称为比较函数,该函数只有在返回值大于0时才会置换

比较函数的参数类型和返回类型都是固定的,const void* 中,const保证不会改变传过来的数据,void*则可以接收任一类型的指针,

在使用qsort函数时,比较函数需根据不同类型的数据进行不同的返回设计,在返回值大于0时才会置换

二、void*类型解释

​void类型被称为空类型指针,因此它可以接收任一类型的指针,但是void类型的数据无法解引用(不确定类型)和加减操作(不确定所占字节大小)

三、函数的使用

1.整型数据排序

int cmp_int(const void* e1,const void* e2)

{

return (*(int*)e1) - (*(int*)e2);

}
int main(){
int arr[5] = { 5,4,3,2,1 };

qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_int);

for (int i = 0; i < 5; i++)

{

printf("%d ", arr[i]);

}
}


2.结构体整型数据排序

​struct Std {

int age;

char name;

int sex;

};
int main
{
struct Std s[3] = { {10,"zs",1},{20,"ls",1},{30,"ww",0} };

qsort(s, sizeof(s)/ sizeof(s[0]), sizeof(s[0]), cmp_struct);

for (int i = 0; i < 3; i++)

{

printf("%d ", s[i].age);

}
}

3.结构体字符数据大小排序

​struct Std {

int age;

char name[10];

int sex;

};

int cmp_structchar(const void* e1, const void* e2)

{

return strcmp(((struct Std*)e1)->name, ((struct Std*)e2)->name);

}
int main()
{
struct Std s[3] = { {10,"zss",1},{20,"ls",1},{30,"wssw",0} };



qsort(s, sizeof(s)/ sizeof(s[0]), sizeof(s[0]), cmp_structchar);

for (int i = 0; i < 3; i++)

{

printf("%s ", s[i].name);

}
}

标签:const,struct,int,void,qsort,C语言,sizeof,库函数
From: https://blog.51cto.com/u_15466618/6022503

相关文章

  • C语言菱形图案绘制
    #include<stdio.h>#defineH29intmain(){ inti,j,z; for(i=1;i<=(H+1)/2;i++) { for(j=(H+1)/2;j>=i;j--) putchar(''); for(z=1;z<2*i;z++) putchar('*'); p......
  • C语言:结构体指针
    #include<stdio.h>main(){structsk{inta;floatb;}data,*p;p=&data;data.a=10;printf("%d\n",(*p).a);printf("%d\n",p->a)......
  • 依次输入一个学生的学号,以及3科(C语言,数学,英语)成绩,在屏幕上输出该学生的学号,3科成绩。
    输入描述:学号以及3科成绩,学号和成绩之间用英文分号隔开,成绩之间用英文逗号隔开。输出描述:学号,3科成绩,输出格式详见输出样例。示例1输入17140216;80.845,90.55,100.00......
  • c语言中的宏定义
    普通函数    #include<stdio.h>         intsq_int(intx)    {      returnx*x;    }        ......
  • C语言:二维字符数组
    #include<stdio.h>main(){chara[3][10]={"beijing","shanghai","tianjin"},*pa=a[0];printf("%s\n",*(a+1));printf("%s\n",a+1);printf("%s\n",......
  • 初识C语言(下)
    写在前面好了,现在我们开始C语言的第二个部分.今天我们需要看下面几个知识点,都是非常简单的,我们主要认识一下.数组我们知道一个一个属性可以用一个类型去表示,那么我想问......
  • 初识C语言(上)
    写在前面我们正式开始接触到C语言,这是我在学习过C语言后重新写的博客,我把之前的稍微优化了一下,希望能用更加朴素的语言和大家分享,我希望给大家带来一个可以看的懂,理论......
  • C语言:求大于指定整数的最接近的五个素数
      #include<stdio.h>intsx(intn){inta;for(a=2;a<n;a++)if(n%a==0)return0;return1;}voidsxa(intb){intc=1,a=b;whil......
  • C语言:统计1-10 11-20 21-30 。。。90-99的数量
      #include<stdio.h>main(){intn,a[10]={0};scanf("%d",&n);while(n>0&&n<=99){if(n>0&&n<=10)a[(n-1)/10]++;elsea......
  • C语言数组和指针传参
    一、数组传参1.一维数组传参一维数组传参时,形参有两种表示方法,1.1.一维数组来接收实参的一维数组首地址(形参的数组在编译器眼里就是一个指针,[]里的数字可写可不写),1.2.一级......