?qsort 是一个库函数,是一个排序函数,所用的算法思想是快速排序(quick sort)。
qsort ()函数是 C 库中实现的快速排序算法,包含在 stdlib.h 头文件中,需要四个元素[首元素地址,元素个数,元素大小,比较方式(函数,返回值都为int)]
首先了解一下qsory的原型
void qsort( void *base,//首元素的地址
size_t num,//数组长度
size_t width,//元素大小单位是字节
int(返回类型int) ( *compare )(const void *elem1(参数1), const void *elem2 (参数2)) );//比较方法函数指针,有两个参数。
下面举个例子
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<math.h>
#include<stdlib.h>
int cmp_int (const void* e1, const void* e2)//整形比较函数
{
return *(int*)e1-*(int*)e2;//如果第一个数大于第二个数返回一个大于0的数,如果第一个数小于第二个数返回一个于0的数,如果第一个数等于第二个数返回0,
}
void test()
{
int arr[] = { 2,1,7,8,6,3,5,4,9,0 };
int sz = sizeof arr / sizeof arr[0];
qsort(arr, sz, sizeof(arr[0]), cmp_int);//qsort ()函数是 c 库中实现的快速排序算法,包含在 stdlib.h 头文件中,需要四个元素[首元素地址,元素个数,元素大小,比较方式(函数)]
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int cmp_float(const void* e1, const void* e2)//浮点型比较函数
{
if (*(float*)e1 - *(float*)e2 > 0)
{
return 1;
}
else if (*(float*)e1 - *(float*)e2 <0)
{
return -1;
}
else if (*(float*)e1 - *(float*)e2 == 0)
{
return 0;
}
}
void test1()
{
float f[] = {9.0,3.0,4.0,5.0,2.0,1.0,8.0,6.0,7.0};
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("%f ", f[i]);
}
}
struct stu //创建一个学生结构体
{
char name[20];
int age;
};
int cmp_float(const void* e1, const void* e2)
{
return ((struct stu*)e1)->age - ((struct stu*)e2)->age;//先强制转换成结构体类型,再找到年龄
}
void test2()//用年龄比较
{
struct stu s[3] = { {"zhangsan",19},{"lisi",17},{"wangwu",54} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_float);
int i = 0;
for ( i = 0; i < sz; i++)
{
printf("%d ", s[i].age);
}
}
int cmp_float(const void* e1, const void* e2)
{
//比较名字就是比较字符串
//不能直接用<>=来比较,要使用strcmp,引用头文件string
return strcmp(((struct stu*)e1)->name,((struct stu*)e2)->name);
}
void test3()//用名字比较
{
struct stu s[3] = { {"zhangsan",19},{"lisi",17},{"wangwu",54} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_float);
int i = 0;
for ( i = 0; i < sz; i++)
{
printf("%s", s[i].name);
}
}
int main()
{
test();//整形排序
test1();//浮点型排序
test2();//结构体排序
test3();//
return 0;
}
觉得有用的话点个赞吧
|