模拟实现qsort()

简介: 🌸🌸🌸学了qsort()之后,让排序变得非常的简单。又经过深入学习发现,用之前学的冒泡排序能够模拟实现qsort().🌸🌸🌸

🌸🌸🌸学了qsort()之后,让排序变得非常的简单。又经过深入学习发现,用之前学的冒泡排序能够模拟实现qsort().🌸🌸🌸

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

自定义函数

排序

冒泡排序实现

疑惑

为什么将base强制转化为(char*)呢?

结果


自定义函数

首先模拟qsort(),自定义一个函数,是这个函数的参数qsort()保持一致

void buble_sort(void* base,int sz,int width,int (*cmp)(const void*e1,const void*e2))

这里也需要传入 待排序数据的第一个元素的地址,排序元素的个数,一个元素有多少个字节,自定义比较函数。

排序

然后冒泡排序实现

1. void buble_sort(void* base,int sz,int width,int (*cmp)(const void*e1,const void*e2))//这里的函数指针可以方便调用各种类型比较,不同类型的变量比较,可以调用不同类型的比较函数
2. {
3. int i=0,j=0;
4. //sz个元素就有sz-1趟
5. for(i=0;i<sz-1;i++)
6.     {
7. for(j=0;j<sz-1-i;i++)
8.         {
9. //两个元素的比较
10. //arr[j] arr[j+1]
11. if(cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)
12.             {
13. //交换
14. swap((char*)base+j*width,(char*)base+(j+1)*width,width);//然后把这个变量的地址传给交换函数
15.             }
16.         }
17.     }
18. }

比较函数用的是整形变量的比较

1. int cmp_int(const void* e1,const void* e2)//对整形比较
2. {
3. return *(int*)e1-*(int*)e2;
4. }

疑惑

或许大家会疑惑这些代码?

if(cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)

为什么将base强制转化为(char*)呢?

假如比较的是整形变量,我们将base转化为(char*),加上width(就是这里的整形变量的大小,4字节)就可以找到下个元素的地址, 字符变量也一样,加上width(就是这里的字符变量的大小,1字节),其他变量也一样,这里是为了排序各种的类型变量,达到和qsort()一样的功能。

swap((char*)base+j*width,(char*)base+(j+1)*width,width)

自定义的交换函数

1. void swap(char* buf1,char*buf2,int width)
2. {
3. for(int i=0;i<width;i++)
4.     {
5. char temp=*buf1;
6.         *buf1=*buf2;
7.         *buf2=temp;
8.         buf1++;
9.         buf2++;
10.     }
11. }

这里的交换函数交换的方法和以往的交换方法有些许不同,哪里不同呢?以前我们交换两个变量的值,只需要定义一个临时变量去实现,例如:int temp=0,a1=2,a2=3;我们交换只需要让a1=temp,a1=a2,a2=temp,这样a1和a2的值就交换了。但是这里的swap()函数的交换,不是交换的变量整个的值(这里是整形变量),也就是说不是一次性交换4个字节的内容,而是一个字节一个字节的交换。为什么这样做呢?这交换的是整形变量,万一我下次交换字符变量呢,所以我们一个字节一个字节的交换,保证能够交换其他类型变量的功能。

结果

这样我们就掌握了模拟实现qsort()的基本要点和难点,那让我们整体实践一下

1. #include<stdio.h>
2. void swap(char* buf1,char*buf2,int width)
3. //为什么不直接进行交换,而是交换每个字节的内容?这是因为这交换的不只是整形变量,这里还可以交换其它类型的变量
4. 
5. {
6. for(int i=0;i<width;i++)
7.     {
8. char temp=*buf1;
9.         *buf1=*buf2;
10.         *buf2=temp;
11.         buf1++;
12.         buf2++;
13.     }
14. }
15. void buble_sort(void* base,int sz,int width,int (*cmp)(const void*e1,const void*e2))//这里的函数指针可以方便调用各种类型比较,不同类型的变量比较,可以调用不同类型的比较函数
16. {
17. int i=0,j=0;
18. //sz个元素就有sz-1趟
19. for(i=0;i<sz-1;i++)
20.     {
21. for(j=0;j<sz-1-i;i++)
22.         {
23. //两个元素的比较
24. //arr[j] arr[j+1]
25. if(cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)//为什么将base强制转化为(char*)呢?假如比较的是整形变量,我们将base转化为(char*),加上width(就是这里的整形变量的大小,4字节)就可以找到下个元素的地址,
26.             {
27. //交换
28. swap((char*)base+j*width,(char*)base+(j+1)*width,width);//然后把这个变量的地址传给交换函数
29.             }
30.         }
31.     }
32. }
33. int cmp_int(const void* e1,const void* e2)//对整形比较
34. {
35. return *(int*)e1-*(int*)e2;
36. }
37. int main()
38. {
39. int arr[10]={2,3,4,5,6,7,1,9,13,10};
40. int sz=sizeof(arr)/sizeof(arr[0]);
41. buble_sort(arr,sz,sizeof(arr[0]),cmp_int);
42. for(int i=0;i<sz;i++)
43.         {
44. printf("%d ",arr[i]);
45.         }
46. return 0;
47. }

运行结果

9F73F8DB-EB5D-454D-9EC8-F8B2B9A52987.jpeg

❤️ ❤️❤️模拟实现qsort()的内容大致就是这些了,如果大家有什么问题建议都可以发在评论区,我可以和大家一起探讨,共同学习,共同进步。🐶🐶🐶

相关文章
|
6月前
|
编译器 C语言
库函数qsort的使用及利用冒泡排序模拟实现qsort
库函数qsort的使用及利用冒泡排序模拟实现qsort
|
5月前
|
搜索推荐 C语言
模拟实现qsort函数:冒泡排序详解
模拟实现qsort函数:冒泡排序详解
32 1
|
6月前
|
搜索推荐 C语言
冒泡排序模拟实现qsort()函数
冒泡排序模拟实现qsort()函数
39 0
用冒泡模拟qsort的实现
用冒泡模拟qsort的实现
34 0
qsort函数和模拟实现qsort函数
qsort函数和模拟实现qsort函数
|
11月前
|
程序员
qsort函数的模拟实现
qsort函数的模拟实现
50 1
|
存储 算法 测试技术
深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数
深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数
44 0
|
搜索推荐 C语言
深入理解回调函数qsort:从入门到模拟实现(上)
深入理解回调函数qsort:从入门到模拟实现(上)
83 0
|
C语言 C++
深入理解回调函数qsort:从入门到模拟实现(下)
深入理解回调函数qsort:从入门到模拟实现(下)
44 0