🔥博客主页🔥:【 坊钰_CSDN博客 】
欢迎各位点赞👍评论✍收藏⭐
目录
1. 函数介绍
2. qsort举例排列整型变量
3. qsort举例排列结构型变量
3.1 按名字排序
3.1.1 srtcmp函数
3.2 按年龄排序
4. qsort函数模拟实现(采用冒泡的方式)
5. 小结
1. 函数介绍
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
可以看到qsort函数有四种参数,我们来一一解释:
1. void* base
指向要排序的数组的第一个对象的指针,转换为 void*,通俗来讲就是数组首元素地址;
2. size_t num
数组中指向的元素个数;
3. size_t size
数组中每个元素的大小(以字节为单位);
4. int (*compar)(const void*,const void*)
指向比较两个元素的函数的指针。
此函数通过比较两个元素反复调用。它应遵循以下原型:将两个指针作为参数(都转换为 const void*)。该函数通过返回(以稳定和传递的方式)定义元素的顺序:
注意:qsort函数无返回值;
2. qsort举例排列整型变量
#include <stdio.h>
int cmp_imp(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int main()
{
int arr[] = { 2,3,4,1,5,7,6,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_imp);
for (int i = 0; i < sz; i++)
{
printf("%d ", *(arr + i));
}
return 0;
}
3. qsort举例排列结构型变量
这是一个结构体
struct Student
{
char name[100];
int age;
};
3.1 按名字排序
这个用到了strcmp函数
3.1.1 srtcmp函数
int strcmp ( const char * str1, const char * str2 )
返回值
代码:
#include <stdio.h>
struct Student
{
char name[100];
int age;
};
void cmp_srt_imp(const void* p1, const void* p2)
{
return strcmp(((struct Student*)p1)->name , ((struct Student*)p2)->name);
}
int main()
{
struct Student arr[3] = { {"zhangsan",18},{"lisi",20},{"wangwu",19}};
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_srt_imp);
for (int i = 0; i < sz; i++)
{
printf("%s %d ", arr[i]);
}
return 0;
}
3.2 按年龄排序
struct Student
{
char name[100];
int age;
};
void cmp_srt_imp(const void* p1, const void* p2)
{
return ((struct Student*)p1)->age - ((struct Student*)p2)->age;
}
int main()
{
struct Student arr[3] = { {"zhangsan",18},{"lisi",20},{"wangwu",19} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_srt_imp);
for (int i = 0; i < sz; i++)
{
printf("%s %d ", arr[i]);
}
return 0;
}
4. qsort函数模拟实现(采用冒泡的方式)
用这样的方式qsort函数可排列任意的数据类型
代码:
#include <stdio.h>
//仿qsort函数重写冒泡排序
int cmp(const void* p1, const void* p2) //所选择的比较方法
{
return (*(int*)p1 - *(int*)p2);
}
void cmp_swap(char* p1, char* p2,int width) //实现数组元素的交换
{
for (int i = 0; i < width; i++)
{
int ret = *p1;
*p1 = *p2;
*p2 = ret;
p1++;
p2++;
}
}
void bubble(void* base, int sz, int width, int (*cmp)(const void* p1, const void* p2))
{
for (int i = 0; i < sz - 1; i++) //冒泡排序趟数
{
for (int j = 0; j < sz - i - 1; j++) //每一趟冒泡排序
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width )> 0)
{
//符合条件进行交换
cmp_swap(((char*)base+j*width), ((char*)base + (j+1) * width),width);
}
}
}
}
int main()
{
int arr[] = { 2,1,3,5,6,4,7,9,8,10 }; //定义整型数组并初始化
int sz = sizeof(arr) / sizeof(arr[0]); //计算数组长度
bubble(arr,sz,sizeof(arr[0]),cmp); //模拟qsort函数实现冒泡排序
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
5. 小结
以上就是关于qsort函数的内容了,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持!