函数用法:
首先是qsort()的原型:
void qsort(void *base,int nelem,int size,int (*cmp)(const void *,const void * ))
参数说明
- base – 指向要排序的数组的第一个元素的指针。
- nelem – 由 base 指向的数组中元素的个数。
- size – 数组中每个元素的大小,以字节为单位。
- cmp – 用来比较两个元素的函数。
其中,函数cmp原型如下:
int cmp(const void * elem1,const void * elem2)
{
int * p1 = (int *) elem1;
int * p2 = (int *) elem2;
return *p1-*p2;
}
对于cmp函数的参数 *elem1与 *elem2:
1)如果 *elem1应该排在 *elem2前面,则函数返回值为负整数
2)如果 *elem1和 *elem2哪个排在前面都行,则函数返回值为0
3)如果 *elem1应该排在 *elem2后面,则函数返回值为正整数
特别地,需要对二维数组进行按列进行排序时:
//二维指针int** a表示存放一个指针的地址
int cmp(const void *a,const void *b){
int *a1=*(int**)a;//将二维数组a的值赋值给a1
int *b1=*(int**)b;//b1[1]、a1[1]表示二维数组的列
return b1[1]-a1[1];//按行排序则为a1[0]
}
出处:
在leetcode上写贪心算法题时遇到的背包问题:
计算收益的思路很简单,但一直写不出好的排序方法,直到发现可以用qsort函数进行排序。
附上参考答案:
int cmp(const void *a, const void *b)
{
int *pa=*(int **)a;
int *pb=*(int **)b;
return (pb[1])-(pa[1]);
}
int maximumUnits(int** boxTypes, int boxTypesSize, int* boxTypesColSize, int truckSize){
int res=0;
int min;
qsort(boxTypes,boxTypesSize,sizeof(int*),cmp);
for (int i=0;i<boxTypesSize;i++)
{
min=fmin(boxTypes[i][0],truckSize);
truckSize-=min;
res+=min*boxTypes[i][1];
}
return res;
}