🔥博客主页🔥:【 坊钰_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函数的内容了,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持!