今天无意间看见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
感触:当然两种方法都可以很好的完成功能,但从编码量和编码思想(对内存,变量理解的角度)源码的确实做的很好。
多读源码,多多练习