qsort对多维数组和结构体的排序
多维数组
对于malloc动态申请的多维数组(指针数组)
以⼀个例⼦解析:
要求——
打算操作⼀个数组,数组的每个元素是⼀个指针,指向2个元素的数组。元素的⼤⼩关系为先⽐较第⼀个元素,第⼀个元素相同⽐较第⼆个元素。
1. ⾸先,通过malloc对指针数组进⾏分配:
先分配⼀个指向元素为int *的⼀维数组,所以数组类型为int **;
2. 然后,针对每⼀个数组⾥的int *型指针,分配⼀个⼀维数组,数组类型为int。
int *b,**a;
a = (int**)malloc(500000*sizeof(int*)); //这⾥是对int*来分配。
for(i=0;i<500000;i++)
{
b = malloc(2*sizeof(int));
a[i] = b;
}
顺带插个⼴告:
这样申请的数组,释放⽅式为
for(i=0;i<n;i++) { free(a[i]); } free(a); ⽽不是直接free(a);因为malloc和free要⼀⼀对应,所以第⼀种是正确的。
qsort的cmp的写法:
⼊参实际是数组元素的指针,这⾥元素是int*,所以⼊参应该是int**,⽽要⽐较的数组是这个指针指向的内容。
sizeof 指针将void* a强制转型为本来的样⼦int **,然后ap指针指向a的第⼀个元素(这个元素也是指针,指向⼀个int型⼀维数组);
int cmp(const void *a,const void *b)
{
int *ap = *(int **)a;
int *bp = *(int **)b;
if(ap[0] == bp[0])
return ap[1] - bp[1];
else
return ap[0] - bp[0];
}
对于⾮malloc申请的多维数组
⽐如:⼆维数组 int a[5][2];
要求:按照⼆维数组每⼀维的第⼀个元素排序。
⽐较算法cmp:
int cmp(const void *a, const void *b)
{
return ((int *)a)[0] - ((int *)b)[0];
}
结构体
结构体排序相对简单。
例如——
结构体的结构:
typedef struct node{
int x;
int y;
int z;
}Node;
⽐较算法cmp,切记强制转型不如->优先级⾼:
int cmp(const void *a, const void *b)
{
//    return (Node *)a->x - (Node *)b->x;  //错误写法!
//    return ((Node *)a)->x - ((Node *)b)->x;  //正确写法1
return (*(Node *)a).x - (*(Node *)b).x;    //正确写法2
}
排序:
qsort(a, n, sizeof(a[0]), cmp);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。