🚀write in front🚀
📝个人主页:认真写博客的夏目浅石.
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:凡人修C传
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️==如果无聊的话,就来逛逛我的博客栈吧==
前言
今天给大家介绍C语言
中一个比较好用的函数qsort
函数以及我们模拟实现qsort
函数的过程。
提示:以下是本篇文章正文内容,下面案例可供参考
一、qsort函数介绍
这里是qsort
函数的介绍,在下面简单的给大家翻译介绍一下
二、qsort的作用
首先最上面说到它的作用,执行一个快速排序,qsort
函数是一个排序函数,它的底层排序算法是快速排序
。
想要了解快速排序的可以去这里学习,链接已经附上,快去学习吧~
三、qsort的参数
void qsort
( void *base
, size_t num
, size_t width
, int (__cdecl *compare )(const void *elem1, const void *elem2 )
);`
接着就是它的返回值和参数,我们可以看到这长长的一串,看着就头疼,不过也没大家想象的那么复杂,给大家介绍一下大家就明白了。
首先看我们的第一个参数base
,就是一个我们待排序的数组,接着就是num
,顾名思义就是我们数组元素的的大小,待排序元素的个数,然后就是width
参数,也就是我们待排元素中每个元素的大小,最后就是int (__cdecl *compare )(const void *elem1, const void *elem2 )
这是一个回调函数
,其中compare
是一个函数指针
,函数的两个参数分别是elem1
和elem2
(类型是void*
)返回值是int
类型,最后qsort
的返回类型是void
型。
四、qsort的用法
4.1排序整形数组
#include<stdio.h>
#include<stdlib.h>
//整数的比较
int cmp1(const void* e1, const void* e2)
{
return *((int*)e1) - *((int*)e2);
}
//测试整数
void test1()
{
int arr[5] = {
5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp1);
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
test1();
return 0;
}
4.2排序其他类型
//浮点数的比较
int cmp2(const void* e1, const void* e2)
{
return *((double*)e1) - *((double*)e2);
}
//字符的比较
int cmp3(const void* e1, const void* e2)
{
return *((char*)e1) - *((char*)e2);
}
//字符串的比较
int cmp4(const void* e1, const void* e2)
{
return strcmp(*(char**)e1, *(char**)e2);
}
//结构体数字比较
int cmp5(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//结构体字符串比较
int cmp6(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
五、模拟实现qsort函数
由于目前考虑让更多人理解qsort
函数的使用,所以博主就打算带着大家,利用泡泡排序
的思路来详细讲解qsort
5.1主函数书写
int main()
{
int arr[]={
9,8,7,6,5,4,3,2,1,0};
int sz=sizeof(arr)/sizeof(arr[0]);
//四个参数对标qsort的四个参数
bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
for(int i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
5.2泡泡排序的书写
void bubble_sort(void* base,int sz,int width,int (cmp_int)(const void* e1,const void* e2))
{
int i=0;
for(i=0;i<sz-1;++i)
{
int j=0;
for(j=0;j<sz-i-1;++j)
{
if(cmp_int((char*)base+j*width,(char*)base+(j+1)*width)>0)
{
Swap((char*)base+j*width,(char*)base+(j+1)*width,width);
}
}
}
}
5.3比较函数和交换函数的实现
int cmp_int(const void* e1,const void* e2)
{
return *(int*)e1- *(int*)e2;
}
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++;
}
}
5.4整形数组排序的总代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp_int(const void* e1,const void* e2)
{
return *(int*)e1- *(int*)e2;
}
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,int sz,int width,int (cmp_int)(const void* e1,const void* e2))
{
int i=0;
for(i=0;i<sz-1;++i)
{
int j=0;
for(j=0;j<sz-i-1;++j)
{
if(cmp_int((char*)base+j*width,(char*)base+(j+1)*width)>0)
{
Swap((char*)base+j*width,(char*)base+(j+1)*width,width);
}
}
}
}
int main()
{
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);
for(int i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
5.5所有类型数组的排序代码总结
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{
int age;
char name[20];
};
//整数的比较
int cmp1(const void* e1, const void* e2)
{
return *((int*)e1)-*((int*)e2);
}
//浮点数的比较
int cmp2(const void* e1, const void* e2)
{
return *((double*)e1) - *((double*)e2);
}
//字符的比较
int cmp3(const void* e1, const void* e2)
{
return *((char*)e1) - *((char*)e2);
}
//字符串的比较
int cmp4(const void* e1, const void* e2)
{
return strcmp(*(char**)e1, *(char**)e2);
}
//结构体数字比较
int cmp5(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//结构体字符串比较
int cmp6(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//模拟实现qsort函数
void swap(char* ch1, char* ch2, int sz)
{
for (int i = 0; i < sz; i++)
{
char tem = *ch1;
*ch1 = *ch2;
*ch2 = tem;
ch1++;
ch2++;
}
}
void bubble_sort(void* arr, int num, int size, int (*cmp)(const void* e1, const void* e2))
{
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num - i - 1; j++)
{
//cmp((char*)arr + j * size, (char*)arr + (j + 1) * size)
if (cmp((char*)arr + j * size, (char*)arr + (j + 1) * size))
{
swap((char*)arr + j * size, (char*)arr + (j + 1) * size, size);
}
}
}
}
//测试整数
void test1()
{
int arr[5] = {
5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp1);
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
//测试浮点数
void test2()
{
double arr[5] = {
2.5,2.3,3.8,6.1,0.2 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp2);
for (int i = 0; i < 5; i++)
{
printf("%.1lf ", arr[i]);
}
printf("\n");
}
//测试字符
void test3()
{
char arr[5] = {
'e','f','o','a','q' };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp3);
for (int i = 0; i < 5; i++)
{
printf("%c ", arr[i]);
}
printf("\n");
}
//测试字符串
void test4()
{
char* arr[] = {
"shan","huani","ajfie","deygufefb" };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp4);
for (int i = 0; i < sz; i++)
{
printf("%s ", arr[i]);
}
printf("\n");
}
//测试结构体中的排序
void test5()
{
struct Stu arr[4] = {
{
11,"uheriu"},{
37,"iuehen"},{
8,"aouenioon"},{
22,"ming"} };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp5);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i].age);
}
printf("\n");
bubble_sort(arr, sz, sizeof(arr[0]), cmp6);
for (int i = 0; i < sz; i++)
{
printf("%s ", arr[i].name);
}
}
int main()
{
test1();
test2();
test3();
test4();
test5();
return 0;
}
总结
我是夏目浅石,希望和你一起学习进步,刷题无数!!!希望各位大佬能==一键三连==支持一下博主,hhhh~我们下期见喽
==如果无聊的话,就来逛逛我的博客栈吧==
✨$\textcolor{blue}{原创不易,还希望各位大佬支持一下}$
👍 $\textcolor{9c81c1}{点赞,你的认可是我创作的动力!}$
⭐️ $\textcolor{ed7976}{收藏,你的青睐是我努力的方向!}$
✏️ $\textcolor{98c091}{评论,你的意见是我进步的财富!}$