读stdlib.h 库qsort源码 ,对上篇文章(回调函数)排序进行修改:

 

今天无意间看见stdlib.h库 文件中的qsort() 函数的源码,颇有感触,并且觉得自己在上篇博客写的代码虽然还可以,但在看了源码后,觉得自己还是有些思想上的问题。故 写这篇文章给自己纠正。


上篇中的sort()函数原型:

    void sort(const void *,const int number,unsigned width,int(*compare)(void  *,void  *),void (*swap)(void  *,void  *));    

其实仔细分析,void(*swap)(void * ,void *)这个参数完全可以省略。

原因分析: 功能 ,swap 作为一个函数参数传递,完成的功能是成功交换任何类型的两个参数值.

                     相同的,如果已经知道一个类型内存宽度(width),并且知道起始指针地址,完全可以使用一个通用函数完成任何交换。

swap()函数可以写成:

    static void swap(char *tmp_a, char *tmp_b,unsigned width)  
    {  
            char temp;  
            if(tmp_a!=tmp_b)  
              while(width--)  
                    {  
                   temp      =  *tmp_a;  
                   *tmp_a++  =  *tmp_b;  
                   *tmp_b++  =  temp;  
                    }                   
    }  

这样一来,我们的sort()函数参数减少一个,相应功能函数也减少。代码量小了,思路也清晰了。

下面是我改写后的sort()函数:

函数原型:

    void sort(const void *,const int number,unsigned width,int(*compare)(void  *,void  *));  

函数实现:

/*sort排序函数使用普通的选择排序*/  
void sort(const void *_tmp,const int number,unsigned width,int(*compare)(void *,void *))  
{  
    int i,j,small;  
     for(i=0;i<number-1;i++)  
       {  
        small=i;  
        for(j=i+1;j<number;j++)  
              if(compare((((char *)_tmp)+j*width),(((char *)_tmp)+small*width)))//if(_tmp+j<_tmp_small) return TURE;  
                    small=j;  
        if(small!=i)           
           swap((((char *)_tmp)+i*width),(((char *)_tmp)+small*width),width);  
       }   
} 

整个程序其他部分不用更改,即可完成相同的功能。

下面是更改后的程序运行结果:


    [trageday@trageday C_test]$ gcc   -o callback_sort  callbacksort\(pro\).c  
    [trageday@trageday C_test]$ ./callback_sort   
    1 2 3 4 5 6 7 8 9 12   
    a b c d g h m q t w 

感触:当然两种方法都可以很好的完成功能,但从编码量和编码思想(对内存,变量理解的角度)源码的确实做的很好。

             多读源码,多多练习 







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值