Holle, 各位小伙伴,今天呢我们给大家介绍一下qsort这一个函数是如何使用的,并且通过了解这个函数实现的原理进而来实现这一个函数。
qsort函数(以下内容参考cplusplus网站中对qsort函数的介绍)
qsort函数的用处
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
对数组的元素进行排序
对 所指向的数组元素进行排序,每个元素的长度为字节,使用函数确定顺序。
此函数使用的排序算法通过调用指定的函数来比较元素对,并将指向元素的指针作为参数。
该函数不返回任何值,而是通过对数组的元素进行重新排序来修改所指向的数组的内容,如 所定义的那样。
等效元素的顺序未定义。
qsort函数包含的参数
基础
指向要排序的数组的第一个对象的指针,转换为 .void*
数字
数组中由 指向的元素数。
是无符号整数类型。basesize_t
大小
数组中每个元素的大小(以字节为单位)。
是无符号整数类型。size_t
比较
指向比较两个元素的函数的指针。
重复调用此函数来比较两个元素。它应遵循以下原型:qsort
| |
将两个指针作为参数(均转换为 const void*)。该函数通过返回(以稳定和传递的方式)来定义元素的顺序:
返回值 | 意义 |
---|---|
<0 | 指向的元素位于指向的元素之前p1p2 |
0 | 指向的元素等同于 指向的元素p1p2 |
>0 | 指向的元素位于 指向的元素之后p1p2 |
对于可以使用常规关系运算符进行比较的类型,常规函数可能如下所示:compar
| |
返回值
qsort函数没有返回值
使用qsort函数
利用qsort函数实现冒泡排序
#include <stdio.h>
#include <stdlib.h> /* qsort函数的实现要包含头文件stdlib.h */
int values[] = { 4, 10, 98, 70, 10, 36 };
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main ()
{
int n;
qsort (values, 6, sizeof(int), compare);
for (n=0; n<6; n++)
printf ("%d ",values[n]);
return 0;
}
利用qsort函数实现对结构体的排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu//这里我们在结构体中设定两个内容
{
char name[20];
int age;
};
//利用年龄排序
int cmp_struct_age(const void* p1, const void* p2)
{
return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
//利用名字排序
int cmp_struct_name(const void* p1, const void* p2)
{
return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
void test2()
{
struct stu arr[] = { {"zhangsan", 20}, {"lisi", 36}, {"wagnwu", 18} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_struct_age);//此处可以选择用哪种方式排序
}
int main()
{
test2();
return 0;
}
模拟qsort函数的实现
以模拟结构体排序为例
#include <stdio.h>
#include <string.h>
//进行相邻连个元素之间的交换
void swap(void* p1, void* p2, size_t wight)
{
int i = 0;
for (i = 0; i < wight; i++)
{
char tmp = *((char*) p1 + i);
*((char*)p1 + i) = *((char*)p2 + i);
*((char*)p2 + i) = tmp;
}
}
//模拟qsort函数
void bulle(void* base, size_t sz, size_t wight, int(*cmp)(void*, void*))
{
int i, j;
for (i = 0; i < sz - 1; i++)
{
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp((char*)base + j * wight, (char*)base + (j + 1) * wight) > 0)
{
//在此处将base强制类型转化为char类型是因为,char类型运算时每次增减一个字节
//便于进行找到型对应的元素
swap((char*)base + j * wight, (char*)base + (j + 1) * wight, wight);
}
}
}
}
struct stu
{
char name[20];
int age;
};
int cmp_struct_name(const void* p1, const void* p2)
{
return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
void test2()
{
struct stu arr[] = { {"zhangsan ", 18}, {"lisi", 36}, {"wangwu", 24}};
int sz = sizeof(arr) / sizeof(arr[0]);
bulle(arr, sz, sizeof(arr[0]), cmp_struct_name);
}
int main()
{
test2();
return 0;
}
OK,那么今天我们关于qsort函数的分享就到此为止啦!希望我今天的分享会给大家帮助🌹🌹🌹
下一篇再见啦!!!