/*#include<stdio.h> //对int 型的数据进行从小到大排序 #include<stdlib.h> int haha(const void *a,const void *b) //a b 是void 空指针 可以指向任意类型数据 const是定义不变的数据 不改变的数据 {return *(int *)a-*(int *)b;} // 现在a,b进行强制性转换 比较大小得出返回值 main() { int a[100],i; for(i=0;i<100;i++) { a[i]=100-i; } qsort(a,100,sizeof(a[0]),haha); for(i=0;i<100;i++) printf("%d\n",a[i]); }*/ /*888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888*/ /*#include<stdio.h> //对int 型的数据进行从小到大排序 #include<stdlib.h> int haha(const void *a,const void *b ) { return *(int*)b-*(int*)a; } main() { int a[100],i; for(i=0;i<100;i++) a[i]=i; qsort(a,50,sizeof(a[0]),haha);//对前50位从大到小排序 for(i=0;i<100;i++) printf("%d\n",a[i]); }*/ /*88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888*/ /*#include <stdio.h> //对字符型进行排序 从小到大排序 #include<stdlib.h> int haha(const void *a,const void *b) { return *(char*)a-*(char*)b; } int main(void) { char a[5]; int i; printf("请输入4个字母:"); gets(a); qsort(a,4,sizeof a[0],haha); puts(a); } */ /*88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888*/ /* /*在对浮点或者double型的一定要用三目运算符, 因为如果也使用整型那样的想减的话,如果是两个很接近的数则可能返回一个小数(大于-1,小于1) ,而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系 下面的虽然结果对 但是当出现上面的情况的时候就不对了 啊 正确的看下一楼 */ /* //对浮点型 的从小到大排序 #include <stdlib.h> #include <stdio.h> int love(const void *a,const void *b) { return *(float*)a-*(float*)b; } main() { float a[100]; int i; float b=0.33; for(i=0;i<100;i++) a[i]=100-i+b; qsort(a,100,sizeof a[0],love); for(i=0;i<100;i++) printf("%f\n",a[i]); } /*88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888*/ /*#include <stdlib.h> //正确的浮点型从小到大的排序 #include <stdio.h> int love(const void *a,const void *b) { return *(float*)a>*(float*)b?1:-1; } main() { float a[100]; int i; float b=0.33; for(i=0;i<100;i++) a[i]=100-i+b; qsort(a,100,sizeof a[0],love); for(i=0;i<100;i++) printf("%f\n",a[i]); } */ /*88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888*/ /* #include <stdio.h> //结构体一级排序 从小到大 不了解一级二级 下楼有个二级的 对比下就明白了 #include <stdlib.h> struct shabi { int x; }str[3]; int love(const void *a,const void *b) { return (*(struct shabi* )a).x-(*(struct shabi*)b).x;//注意struct shabi struct 不能少 少了就不对了啊 } main() { int k; str[0].x=10; str[1].x=5; str[2].x=3; qsort(str,3,sizeof(struct shabi),love); //注意sizeof啊 大小是一个一个结构体 大小也可以用str[0]表示 sizeof后的括号不加也行 for(k=0;k<3;k++) { printf("x%d=%d\n",k,str[k].x); } } */ /*88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888*/ /* //结构体2级排序 也就是2种排序结合法 //本例中按x将结构体从小到大排序若x相等则按y从大到小得顺序将结构体排序 //按照x从小到大排序,当x相等时按照y从大到小排序 排得是结构体 #include <stdio.h> #include <stdlib.h> //结构体2级排序 也就是2种排序结合法 struct shabi { int x,y; }str[3]; int love(const void *a,const void *b) { if(((struct shabi* )a)->x==((struct shabi*)b)->x) //这里可以用- 》不过此时要去掉*,就是指(struct shabi* )a不能加* 因为不加*就相当于指针了 可以那样指 return (*(struct shabi*)b).y-(*(struct shabi* )a).y; //而这里加了*号 不是指针 就必须用.来表示 else return (*(struct shabi* )a).x-(*(struct shabi*)b).x; } main() { int k; str[0].x=10; str[1].x=3; str[2].x=3; str[0].y=1; str[1].y=2; str[2].y=8; qsort(str,3,sizeof(struct shabi),love); //注意sizeof啊 大小是一个一个结构体 大小也可以用str[0]表示 sizeof后的括号不加也行 for(k=0;k<3;k++) { printf("x%d=%d,y%d=%d\n",k,str[k].x,k,str[k].y); } } */ /*88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888*/ //最后一楼了 房子快盖好了 呵呵 激动ING 呵呵 /* 按照字符串大小对结构体进行排序 struct In { int data; char str[100]; }s[100]; //按照结构体中字符串str的字典顺序排序 int cmp ( const void *a , const void *b ) { return strcmp( (*(In *)a)->str , (*(In *)b)->str ); } qsort(s,100,sizeof(s[0]),cmp); 这里我就不详细介绍了 大家举一反三吧 上面的例子已经说的很清楚了 */