什么是qsort
我们在cplusplus官网可以查找到关于qsort函数的信息
这些只是qsort函数的大概信息。具体信息我们用一个例子来慢慢讲解。
使用qsort给一个整型数组排序
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[10] = { 2,5,0,1,3,6,7,9,8,4 };
return 0;
}
现在有如下数组arr,我们接下来使用qsort函数对其排序。
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
return ((*(int*)e1) - (*(int*)e2));
}
int main()
{
int arr[10] = { 2,5,0,1,3,6,7,9,8,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
程序运行结果:
接下来请让我讲解一下使用的原理。
其中需要主要讲解的就是第四个参数,请重新看一个该函数的官网介绍:
我来简单总结一下这段的内容。
我们需要给qsort函数提供一个比较数组内容大小的函数,返回类型为int
,如果p1>p2则返回一个大于0的整数,p1<p2则返回一个小于0的整数,两者相等则返回0。了解完这些,我们还剩最后一个问题,这个compar函数的形参是两个void*类型,所以我们在使用之前需要进行强制类型转换
,接下来请看例子:
以上代码经过优化后可以得到一下代码:
int cmp_int(const void* e1, const void* e2)
{
return ((*(int*)e1) - (*(int*)e2));
}
注意:
这段代码实现的功能是将arr数组升序排序,如果需要进行降序排序,只需将e1,e2更换一下位置即可。
经过以上讲解,我们应该对qsort的使用有了大概的了解了吧。
接下来我们再举一个例子,将三个结构体类型的数据按照姓名排序。
请看代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义结构体book
struct book
{
char name[10];
int price;
};
//判断字符串的大小
int cmp_str(const void* e1, const void* e2)
{
return strcmp((*(struct book*)e1).name, (*(struct book*)e2).name);
}
//打印结构体内容
void show_b(struct book b[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%s\n", b[i].name);
}
}
//测试qsort对结构体的排序
void test2()
{
struct book b[3] = { {"sanmao",50},{"cpluse",30},{"game",60} };
int sz = sizeof(b) / sizeof(b[0]);
qsort(b, sz, sizeof(b[0]), cmp_str);
show_b(b, sz);
}
int main()
{
test2();
return 0;
}
程序运行结果:
总结
qsort库函数是一个功能比较强大的函数,它可以排序任意内容的数组。使用该函数需要对指针,函数指针,回调函数有一些了解。qsort内部的实现是使用的快速排序的思想。我们下一期会讲解一下如何使用冒泡排序的思想,自实现qsort函数。
如果本篇博客有出错的地方的话希望大家在评论区指出,大家一起讨论,一起进步!