十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
目录
10年积累的做网站、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先做网站后付款的网站建设流程,更有潮安免费网站建设让你可以放心的选择与我们合作。一、认识qsort()函数
二、使用qsort()函数
1: 冒泡排序: C语言实现冒泡排序【全解析】_weixin_52872520的博客-博客
2:qsort()函数:
3:具体使用:
三、模拟实现qsort()函数
四、以排序整形为例讲解qsort()函数
void qsort( void *base, //待排序数组的起始地址
size_t num, //元素个数
size_t width, //一个元素的大小,单位:字节
int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
//两个元素的比较函数
//通过函数指针调用自己定义的比较函数,这个定义的比较函数被称为回调函数
二、使用qsort()函数
1: 冒泡排序: C语言实现冒泡排序【全解析】-博客
2:qsort()函数:在冒泡排序中,已经实现了整形数组的排序,可是对于字符数组、浮点型数组、结构体数组等其他类型的排序就不用去自己写算法实现,而是通过qsort() - 快速排序实现。
int ( *compare )(const void *elem1, const void *elem2 )
函数的形参被指定为 void* ,可以理解为 void* 为一个通用指针(垃圾桶),可以接收任何类型的指针,void* 的指针不能解引用和 ++,即不能直接使用。但是可以对 void* 的指针进行强制类型转换后使用。
例如:
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
在比较函数中:
3:具体使用:快速排序整形数组:
#include#includeint cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//库函数中一个排序函数:qsort
qsort(arr, sz, sizeof(arr[0]), cmp_int);
//0 1 2 3 4 5 6 7 8 9
//打印
int i = 0;
for (i = 0; i< sz; i++)
{
printf("%d ", arr[i]);
}
}
快速排序结构体:
#include#includestruct Stu
{
char name[20];
int age;
};
//按照学生的年龄来排序
int cmp_stu_by_age(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//按照学生的名字来排序
int cmp_stu_by_name(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp() : 字符串比较函数:按照对应位置上的字符串大小进行比较的
//abcdef 小
//abd 大
int main()
{
struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };
int sz = sizeof(s) / sizeof(s[0]);
//qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
return 0;
}
三、模拟实现qsort()函数改造冒泡排序函数,使得该函数可以排序任意指定的数组。
//使用我们自己写的bubble_sort函数排序整型数组
#include#include//
//实现一个比较整型的函数
//
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
struct Stu
{
char name[20];
int age;
};
//按照学生的年龄来排序
int cmp_stu_by_age(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//按照学生的名字来排序
int cmp_stu_by_name(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp() : 字符串比较函数:按照对应位置上的字符串大小进行比较的
//abcdef 小
//abd 大
void Swap(char* buf1, char* buf2, int width)
{
int i = 0;
for (i = 0; i< width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
//改造冒泡排序函数,使得这个函数可以排序任意指定的数组
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{
//趟数
size_t i = 0;
for (i = 0; i< sz - 1; i++)
{
//一趟冒泡排序的过程
size_t j = 0;
for (j = 0; j< sz - 1 - i; j++)
{
//判断
//base为void*,需要强制类型转换为char*【仅为一个字节】,可以灵活运用;j * width:跳过的步长
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) >0)//用自定义的cmp函数来比较;
{
//交换
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
void test1()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i< sz; i++)
{
printf("%d ", arr[i]);
}
}
//使用我们自己写的bubble_sort函数排序结构体数组
void test2()
{
struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };
int sz = sizeof(s) / sizeof(s[0]);
//bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
test1();
//test2();
return 0;
}
四、以排序整形为例讲解qsort()函数Ⅰ:定义一个降序的整形数组;
Ⅱ:求得整型数组的大小;
Ⅲ:进入bubble_sort()函数进行排序;
Ⅲ①:理解整个bubble_sort函数;
Ⅲ②:利用两层for循环来达到冒泡排序的效果;
Ⅲ③:判断前两个元素的大小:将void*base 的指针强制类型转换为char*,而 j*width 则为一个数据的大小,利用cmp()函数进行比较;
Ⅲ④:实现cmp_int();整形比较的函数
Ⅲ⑤:实现两个元素的交换;
Ⅳ:依照冒泡排序的思想,在bubble_sout()函数中不断排序,达到对整形数组排序的效果;
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧