对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; }