1、qsort概念介绍
qsort()函数(quick sort)是八大排序算法中的快速排序,能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型。
2、qsort()函数实现(循序渐进式讲解)
2.1 qsort()函数
qsort()函数函数函数参数:
void qsort (void* base //待排序数据的起始地址 size_t num, //待排序数据的元素个数 size_t size,//待排序数据中一个元素的大小(单位:字节) int (*compar)(const void*,const void*)//比较两个元素大小的函数指针 );
函数中第一个函数参数(void)的类型非常奇妙,因为待排序数据的元素类型可能是整形、浮点型、字符型、结构体……而void类型就像一个宰相(宰相肚子能撑船)不管你传过来的地址是何类型,我都可以积极的收纳。
函数中第四个函数参数是最难理解的。对于整形数据我们可以通过大小号来比较,对于字符型数据可以用strcmp来比较,但是,我们遇到结构体就出现了问题,结构体中包含的类型多,我们就需要因材施教。
int (*compar)(const void*p1,const void*p2)//比较两个元素大小的函数指针 );
2.2 qsort()函数实现过程
观察冒牌排序:
可得出如下过程:
整形:
//测试qsort()函数功能 int cmp_int(const void* e1, const void* e2) { return *(int*)e1 - *(int*)e2; } void test() { int arr[] = { 9,8,7,6,5,4,3,2,1,0 }; 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]);//打印排列好的数组 } } int main() { test(); return 0; }
结构体:
struct Stu { char name[20] = {0}; int age = 0; }; int cmp_by_name(const void* e1, const void* e2) { return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name); } void test() { struct Stu s[] = { {"zhangsan",10},{"lishi",20}}; qsort(s, sizeof(s), sizeof(s->name),cmp_by_name); printf("%s ", s->name); } int main() { test(); return 0; }
3、小节
有了qsort()函数能有节省不少时间,后期我会出一起通讯录再详细的介绍qsort()函数的使用。