- 前言
- 一、qsort函数功能及用法
- 二、使用步骤
- 1.引入库
- 2.qsort函数排序整形数组
- 3.qsort函数排序浮点型数组
- qsort函数按年龄排序结构体数组
- qsort函数按名字排序结构体数组
- 三、 自建qsort函数
前言
若是代码有什么问题或者大家有什么不理解的地方,欢迎随时来私信我
qsort函数在c语言中有着非常强大的作用,不仅可以排序整形数组、浮点型数组、 还可以排序结构体数组,
下面我将为大家详解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*是比较大小的函数
代码如下:
#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;
}
代码输出结果如下:
代码如下:
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;
}
代码输出结果如下:
代码如下:
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;
}
代码输出结果如下:
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函数比较复杂,大家有什么不理解的欢迎随时提问
代码如下:
#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函数相同,大家可选择相对应的函数自行尝试
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)