文章目录大家好呀!👋这个是付青云同学的博客,是一名大一在校生哦!😁😁
目前一直在学习C语言。🐸
写博客是为了来记录我的学习过程,同时也希望通过博客能够帮助到需要帮助的人。
如果我的博客可以帮助到你,不妨给我一个关注哦😁
- 关于qsort库函数
- 什么是qsort函数
- 用法
- qsort函数排序实例
- 整型数组排序
- 运行结果
- 结构体数据排序
- 运行结果
- 关于模拟实现qsort函数
- 代码实现
- 运行结果
这个函数是一个快速排序的函数
用于各种数据(包括:整型数据、字符串数据、结构体数据等)的排序
那么qsort库函数的用法是怎样呢?
如图:
void qsort(
void *base,//base - 目标数组的开头
size_t number,//number - 元素中的数组个数
size_t width,//width - 元素大小(字节)
int (__cdecl *cmp )(const void *, const void *)
);//cmp - 指向用户提供的例程的指针比较两个数组元素,并返回指定它们关系的值
//void表示可以放任意类型的参数
//关于int (__cdecl *cmp )(const void *, const void *)
int cmp_int(const void* e1, const void* e2)
{
//对于不同的数据,有不同的比较方式,所以需要我们自定义一个函数来说明比的方式
return *(int*)e1 - *(int*)e2;
//返回值:
//< 0 e1小于e2
//= 0 e1等效于e2
//> 0 e1大于e2
//数组按比较函数中定义的升序进行排序。若要以降序对数组进行排序,请反转比较函数中的“大于”和“小于”的意义。
}
qsort函数排序实例
整型数组排序
#include
#include
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
int num = sizeof(arr) / sizeof(arr[0]);
int size = sizeof(arr[0]);
qsort(arr, num, size, cmp_int);
for (int i = 0; i < num - 1; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果
结构体数据排序
#include
#include
#include
struct Stu
{
char name[20];
int age;
};
int sort_age(const void* e1, const void* e2)//如果需要倒序就直接将e1、e2交换
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int sort_name(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
int main()
{
struct Stu s[] = { {"小付",20},{"老李",19},{"坤坤",22},{"钟哥",21} };
int num = sizeof(s) / sizeof(s[0]);
//按照年龄排序
// qsort(s, num, sizeof(s[0]), sort_age);
//按照名字排序
qsort(s, num, sizeof(s[0]), sort_name);
for (int i = 0; i < num; i++)
{
printf("%s %d\n", s[i].name,s[i].age);
}
return 0;
}
运行结果
更多的细节可以去微软官网C语言文档查阅
➡链接在这里⬅
关于模拟实现qsort函数
这里我们用冒泡排序的方法来模拟实现qsort函数的排序
关于冒泡排序我之前也写过一个文章,可以的话大家也可以看看
#include
int cmp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void swap(char* e1, char* e2, int sz)//★将一个数据类型所占的每个字节与另外一个交换,这样不论是1个字节还是4个字节8个字节的数据都可交换
{
int i = 0;
for (i = 0; i < sz; i++)
{
char tmp = *e1;
*e1 = *e2;
*e2 = tmp;
e1++;
e2++;
}
}
void my_qsort(void* arr, int n, int sz, int(*cmp)(const void* e1, const void* e2))
{
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (cmp((char*)arr + j * sz, (char*)arr + (j + 1) * sz) > 0)//★这里用字符指针是为了更加通用:在面对不同的数据类型都可以将每个数据准确识别
{
swap((char*)arr + sz * j, (char*)arr + (j + 1) * sz, sz);
}
}
}
}
int main()
{
int arr[] = { 1,5,7,2,3,11,4,8 };
int n = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr, n, 4, cmp);
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)