🌸🌸🌸学了qsort()之后,让排序变得非常的简单。又经过深入学习发现,用之前学的冒泡排序能够模拟实现qsort().🌸🌸🌸
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
自定义函数
首先模拟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. }
运行结果
❤️ ❤️❤️模拟实现qsort()的内容大致就是这些了,如果大家有什么问题和建议都可以发在评论区,我可以和大家一起探讨,共同学习,共同进步。🐶🐶🐶