void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
关于最后一个参数是一个函数指针
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
那么问题来了。。。。
1:return *(int *)a - *(int *)b;升序?:
2:return *(int *)b - *(int *)a;升序?
答案是1。
简单查看了一下源码:glibc-2.14/stdlib\qsort.c
有一段是这样写的
char *mid = lo + size * ((hi - lo) / size >> 1);
if ((*cmp) ((void *) mid, (void *) lo, arg) < 0)
SWAP (mid, lo, size);
if ((*cmp) ((void *) hi, (void *) mid, arg) < 0)
SWAP (mid, hi, size);
else
goto jump_over;
if ((*cmp) ((void *) mid, (void *) lo, arg) < 0)
SWAP (mid, lo, size);
jump_over:;
left_ptr = lo + size;
right_ptr = hi - size;
lo:相当于指向第一个元素,
hi:相当于指向第二个元素,
mid:中间元素的值
if ((*cmp) ((void *) mid, (void *) lo, arg) < 0)
SWAP (mid, lo, size);
如何mid < lo(第一个元素的值)那么进行交换 说明想要把小值放在前面所以是升序
那么如果自己实现的比较函数里实际是a>b的,但却返回b-a那么 在这种情况下cmp的返回值就是>0的,不进行交换,意思mid>lo就是大数放在前面,所以是降序
分析的有些粗糙,小弟草鸟,有什么不对之处还望大神指出。