目录
简介
头文件
编辑 函数原型:
参数函数如何写:
参数函数要求:
qsort对整性数据的排序:
qsort对字符型数据的排序:
对结构体类型的内部元素排序:
函数的底层是以快速排序实现的
但是本文不深入探讨快速排序是如何进行的,你可以从上面的动图可以有个大致了解。
一,简介
qsort函数(quick sort)是八大排序算法中的快速排序,能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型。
二,头文件<stdlib.h>
三,函数原型:
void qsort (void* base,//要排序的对象的第一个元素的首地址
size_t num, //对象的个数
size_t size,//每一个对象的大小 Size in bytes
int (*compar)(const void*,const void*));//Pointer to a function that compares two elements.(并且这个函数要自己写)
四,参数函数如何写:
4.1参数函数要求:
必须与qsort函数的第四个参数的函数指针的类型相同
两个参数是两个空类型的指针
返回值为整形,对于元素来说:
如果值小于0,第一个小于第二个;
如果值等于0,第一个等于第二个;
如果值大于0,第一个大于第二个;
(这些比较都是以你定义的函数为标准,而比较出来的)
五,具体实例
5.1 qsort对整性数据的排序:
//两个整形元素比较可以用><=来比较
int in_cmp(const void* a,const void* b)
{
return *((int*)a) - *((int*)b);//void*不可直接解引用
}
int main1()
{
int arr[8] = {5,8,9,4,3,2,8,1};
qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),in_cmp);
for(int i = 0;i < 8;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
着重点:
1.qsort函数第四个参数(函数指针的类型)与库函数完全一致;
2.传入的元素的个数,每个元素的大小都可以借助sizeof操作符实现;
3.其余注意写在代码注释中;
5.2 qsort对字符型数据的排序:
//比较两个字符,字符在内存中以ASCII、码存储,可用<>=比较
int ch_cmp(const void* ach,const void* bch)
{
return *(char*)ach - *(char*)bch;//强制类型转化为char*
}
int main2()
{
char *str = "hisndksni";//str为字符串常量,不能被改变
char p[10];//可以创建字符数组,把str内容copy过来
memcpy(p,str,10);
int len = strlen(str);
qsort(p,len,sizeof(char),ch_cmp);
printf("%s",p);
return 0;
}
注重点:
1.对字符串排序,结尾的\0可忽略,所以可用strlen计算元素的个数;
2.字符串常量不能被改变,初始化时要注意;
5.3 对结构体类型的内部元素排序:
struct stu
{
int score;
char* name;
int hight;
};
int stu_cmp_by_score(const void* p1,const void* p2)
{
return ((struct stu*)p1)->score - ((struct stu*)p2)->score;
}
int main()
{
struct stu arr[]= {{90,"zhangsan",175},{88,"lisi",180}};
int sz1 = sizeof(arr)/sizeof(arr[0]);
qsort(arr,sz1,sizeof(arr[0]),stu_cmp_by_score);
for(int i = 0;i < sz1;i++)
{
printf("%d ",arr[i].score);
}
return 0;
}
1.结构体指针写完整;
2.适当的用括号让自己的代码逻辑更加清晰;
cplusplus的qort函数https://legacy.cplusplus.com/reference/cstdlib/qsort/?kw=qsort
完~
未经作者同意禁止转载