对int类型数组排序
int num[100];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b; //升序排序
return *(int *)b - *(int *)a; //降序排序
}/*可见:参数列表是两个空指针,现在他要去指向你的数组元素。所以转型为你当前的类型,然后取值。
升序排列时,
若第一个参数指针指向的“值”大于第二个参数指针指向的“值”,则返回正;
若第一个参数指针指向的“值”等于第二个参数指针指向的“值”,则返回零;
若第一个参数指针指向的“值”小于第二个参数指针指向的“值”,则返回负。
在函数体内要对a,b进行强制类型转换后才能得到正确的返回值,不同的类型有不同的处理方法.
降序排列时,则刚好相反。
cmp返回值的意识:
int cmp(const void *a, const void *b)
返回正数就是说 cmp 传入参数第一个要放在第二个后面, 负数就是传入参数第一个要放第二个前面, 如果是 0, 那就无所谓谁前谁后…
e.g. 农大oj 10th 数字串的比较
#include <stdio.h>
#include <string.h>
int comp1(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int comp2(const void*p1,const void*p2) //从小到大排序
{
return strcmp((char*)p2,(char*)p1);
//字符串的类型比较得到正确返回值
}
int main()
{
int i,n;
scanf("%d",&n);
int a[n],b[n];
char ch[n][10];
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
sprintf(ch[i],"%d",b[i]);
}
qsort(a,n,sizeof(a[0]),comp1);
//第一个为数组名(类似于地址);第二个是参与排序的元素个数;第三个为单个元素的字节大小;第四个为比较函数
qsort(ch,n,sizeof(ch[0]),comp2);
//和sort函数一样,都是按照规定排序,输出是可以自由决定的,通过for循环的起点终点来确定最终是 从小到大 还是 从大到小
for(i=n-1; i>0; i--)
{
printf("%s ",ch[i]);
}
printf("%s\n",ch[0]);
for(i=0; i<n-1; i++)
{
printf("%s ",ch[i]);
}
printf("%s\n",ch[n-1]);
for(i=0; i<n-1; i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[n-1]);
for(i=n-1; i>0; i--)
{
printf("%d ",a[i]);
}
printf("%d\n",a[0]);
return 0;
}


京公网安备 11010502036488号