qsort函数介绍
qsort函数C语言编译器函数库自带的排序函数,其包含在C标准库<stdlib.h>中。函数声明为:
void qsort(void* base,size_t num,size_t width,int (cmp*)(const void* e1,const void* e2);
1.qsort函数返回类型为空;
2.base:是指要排序数组的第一个元素的地址,也可以是数组名,由于要排序的数组类型不能确定,所以指针类型必须是void类型,具体使用时根据需要进行指针类型强制转换
3.num:是指排序数组元素的个数,size_t是头文件里定义的无符号整形
4.width:是指数组中每个元素的字节大小
5.cmp:是一个函数指针用来调用自己定义好要排序数组的函数,函数返回类型是int,函数里的参数是要比较的两个元素地址,类型也是void*,当e1在e2左边,函数返回值<0;当e2在e1左边,函数返回值>0;当e1=e2,函数返回值=0;
函数声明可以在库函数<stdlib.h>中找,也可以在cplusplus中找。
冒泡排序
冒泡排序算法我已经在上篇文章里陈述过,这里不再赘述。
整数
int cmp_int(const void*e1,const void* e2)
{
return *(int*)e1-*(int*)e2;
}
void test_int()
{
int arr[]={9,8,7,6,5,4,3,2,1,0};
int i=0;
int sz=sizeof(arr)/sizeof(arr[0]);
qsort(arr,sz,sizeof(arr[0]),cmp_int);
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
test_int();
//test_float();
//test_stu_age();
//test_stu_name();
return 0;
}
浮点数
int cmp_float(const void* e1,const void* e2)
{
//return (int)(*(float*)e1-*(float*)e2);//强制转换有问题,不能解决9.2和9.3的比较
if(*(float*)e1==*(float*)e2)
{
return 0;
}
else if(*(float*)e1>*(float*)e2)
{
return 1;
}
else
{
return -1;
}
}
void test_float()
{
float f[]={9.125,9.282,9.123,9.540,67.0,6.0,5.0};
int j =0;
int sz=sizeof(f)/sizeof(f[0]);
qsort(f,sz,sizeof(f[0]),cmp_float);
for(j=0;j<sz;j++)
{
printf("%f ",f[j]);
}
}
int main()
{
//test_int();
test_float();
//test_stu_age();
//test_stu_name();
return 0;
}
结构体
struct Stu
{
char name[20];
int age;
};
int cmp_stu_age(const void* e1,const void* e2)
{
return (((struct Stu*)e1)->age)-(((struct Stu*)e2)->age);
}
int cmp_stu_name(const void* e1,const void* e2)
{
//字符串比较使用字符串比较函数strcmp(),strcmp返回类型和qsort一样
return strcmp(((struct Stu*)e1)->name,((struct Stu*)e1)->name);
}
void test_stu_age()
{
struct Stu s[3]={{"zhangsan",30},{"lisi",10},{"wangwu",20}};
int sz=sizeof(s)/sizeof(s[0]);
qsort(s,sz,sizeof(s[0]),cmp_stu_age);
}
void test_stu_name()
{
struct Stu s[3]={{"zhangsan",30},{"lisi",10},{"wangwu",20}};
int sz=sizeof(s)/sizeof(s[0]);
qsort(s,sz,sizeof(s[0]),cmp_stu_name);
//第一个参数:待排序数组的首元素地址
//第二个参数:待排序数组的元素个数
//第三个参数:待排序数组的每个元素的大小,单位是字节
//第四个参数:是函数指针,比较两个元素大小所用函数的地址,自己定义的函数
// 函数的两个参数是带比较元素的地址
}
int main()
{
//test_int();
test_float();
//test_stu_age();
//test_stu_name();
return 0;
}
本文是使用qsort函数对整数、浮点数、结构体数组元素进行排序,新手上传,如有不足请批评指正!