目录
简介
头文件
编辑 函数原型:
参数函数如何写:
参数函数要求:
qsort对整性数据的排序:
qsort对字符型数据的排序:
对结构体类型的内部元素排序:
函数的底层是以快速排序实现的
但是本文不深入探讨快速排序是如何进行的,你可以从上面的动图可以有个大致了解。
一,简介
qsort函数(quick sort)是八大排序算法中的快速排序,能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型。
二,头文件<stdlib.h>
三,函数原型:
void qsort (void* base,//要排序的对象的第一个元素的首地址size_t num, //对象的个数size_t size,//每一个对象的大小 Size in bytesint (*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
完~
未经作者同意禁止转载