函数声明

  void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

参数

  • base-- 指向要排序的数组的第一个元素的指针。
  • nitems-- 由 base 指向的数组中元素的个数。
  • size-- 数组中每个元素的大小,以字节为单位。
  • compar-- 用来比较两个元素的函数,即函数指针

比较函数(只是一个例子)

我从我写的代码中抽了一个例子出来:

int cmp(const void* a, const void* b) {
    if ((*(stu*)a).t == (*(stu*)b).t) {
        if ((*(stu*)a).y > (*(stu*)b).y)
            return -1;
        else
            return 1;
    } else {
        return (*(stu*)a).t < (*(stu*)b).t ? 1 : -1;
    }
}

  注意:传入的形参变量是两个空指针,所以在下面的时候你要将这两个空指针强转为你要比较的类型,例如例子上面的:(stu*)a ,就是把a强转为了我自己定义的结构体类型stu     然后  *(stu*)a 则是对这个指针取内容,至于这个函数是怎么比较的,则下面说:

  如果compar返回值小于0(< 0),那么a所指向元素会被排在b所指向元素的左面;
  如果compar返回值等于0(= 0),那么a所指向元素与b所指向元素的顺序不确定;(这里体现出qsort()的不稳定)
  如果compar返回值大于0(> 0),那么a所指向元素会被排在b所指向元素的右面。
也就是说,如果   a.t>b.t   则return-1;(这里简单写了,能表达意思就行)意思就是,如果a.t大,那a.t就排在前面,也就是对整个数组就行降序排列。