🚀write in front🚀
📝个人主页:认真写博客的夏目浅石.
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:凡人修C传
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️如果无聊的话,就来逛逛我的博客栈吧stack-frame.cn
文章目录
- 前言
- 一、qsort函数介绍
- 二、qsort的作用
- 三、qsort的参数
- 四、qsort的用法
- 4.1排序整形数组
- 4.2排序其他类型
- 五、模拟实现qsort函数
- 5.1主函数书写
- 5.2泡泡排序的书写
- 5.3比较函数和交换函数的实现
- 5.4整形数组排序的总代码
- 5.5所有类型数组的排序代码总结
- 总结
前言
今天给大家介绍C语言
中一个比较好用的函数qsort
函数以及我们模拟实现qsort
函数的过程。
提示:以下是本篇文章正文内容,下面案例可供参考
一、qsort函数介绍
这里是qsort
函数的介绍,在下面简单的给大家翻译介绍一下
二、qsort的作用
首先最上面说到它的作用,执行一个快速排序,qsort
函数是一个排序函数,它的底层排序算法是快速排序
。
想要了解快速排序的可以去这里学习,链接已经附上,快去学习吧~
【algorithm】算法基础课—排序算法(附笔记 | 建议收藏)
三、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~我们下期见喽
如果无聊的话,就来逛逛我的博客栈吧stack-frame.cn
✨原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力!\textcolor{9c81c1}{点赞,你的认可是我创作的动力!}点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!\textcolor{ed7976}{收藏,你的青睐是我努力的方向!}收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!\textcolor{98c091}{评论,你的意见是我进步的财富!}评论,你的意见是我进步的财富!