给定一个数据类型:
typedef struct
{
int a,b,c;
}struction;
现在需要把struction型的数组array首先按照a的大小升序排列,如果a相同则再按照b的大小升序排列,如果b也相同则再按c的大小升序排列。
首先定义三个比较函数
int cmp_a(const void *a,const void *b)
{
struction *aa=(struction*)a,*bb=(struction*)b;
return ((aa->a>bb->a)?1:-1);
}
int cmp_b(const void *a,const void *b)
{
struction *aa=(struction*)a,*bb=(struction*)b;
return ((aa->b>bb->b)?1:-1);
}
int cmp_c(const void *a,const void *b)
{
struction *aa=(struction*)a,*bb=(struction*)b;
return ((aa->c>bb->c)?1:-1);
}
再用qsort()函数先后使用三种比较函数排序。
void Sort(struction *a,int N)
{
for(int i=0;i<N-1;i++)
{
if(a[i].a==a[i+1].a)
{
int cnt=0,j;
for(j=i;a[j].a==a[i].a;j++)cnt++;
qsort(a+i,cnt,sizeof(struction),cmp_a);
i=j-1;
}
}
for(int i=0;i<N-1;i++)
{
if(a[i].b==a[i+1].b)
{
int cnt=0,j;
for(j=i;a[i].b==a[j].b;j++)cnt++;
qsort(a+i,cnt,sizeof(struction),cmp_b);
i=j-1;
}
}
for(int i=0;i<N-1;i++)
{
if(a[i].c==a[i+1].c)
{
int cnt=0,j;
for(j=i;a[i].c==a[j].c;j++)cnt++;
qsort(a+i,cnt,sizeof(struction),cmp_c);
i=j-1;
}
}
}
注意每次使用完qsort()函数后都要令i=j-1,这样可以使的整个排序过程的时间大幅减少。