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