1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| // qsort---排序 //1.void* //1、此类型指针可以接受任意类型的地址 //2、此类型指针不能进行解引用 //3、此类型指针不能进行+-整数的操作 //qsort一般用法为: //qsort(arr,sz,sizeof(arr[0]),cmp_void) //其中cmp函数一般格式为 //int cmp (const void*e1,const void*e2) //{ //在括号里需要是一种返回0,正数,负数的计算 //} //展示例子 //1.首先是整形排序 int cmp_int(const void* e1, const void* e2) { return (*(int*)e1 - *(int*)e2);//由于void*类型不能解引用,因此使用强制类型转换 } //2.接着是浮点数排序 int cmp_float(const void* e1, const void* e2) { //此处需要利用float来返回int会警告,可利用比较大小的方式直接返回整数,但也可以不管警告 return (*(float*)e1 - *(float*)e2); } //3.然后是结构体排序 //定义一个结构体 struct str { char name[20]; int age; };
//(1)通过年龄排序 int cmp_str_age(const void* e1, const void* e2) { return((struct str*)e1)->age - ((struct str*)e2)->age; } //(2)通过名字排序 int cmp_str_name(const void* e1, const void* e2) { return strcmp(((struct str*)e1)->name, ((struct str*)e2)->name); }
int main() { int i = 0; int arr[10] = { 9,8,7,6,5,4,3,2,1,0 }; float arr1[10] = { 9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0,1.0,0 }; struct str s[3] = { {"张三",20},{"李四",10},{"王五",30}};
int sz = sizeof(arr) / sizeof(arr[0]); int sz1 = sizeof(arr1) / sizeof(arr1[0]); int sz2 = sizeof(s) / sizeof(s[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int); for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("\n");
qsort(arr1, sz1, sizeof(arr1[0]), cmp_float); for (i = 0; i < sz1; i++) { printf("%f ", arr1[i]); } printf("\n");
qsort(s, sz2, sizeof(s[0]), cmp_str_name); for (i = 0; i < sz2; i++) { printf("%s ", s[i].name);//!!加点进行访问,不要忘了 } printf("\n");
qsort(s, sz2, sizeof(s[0]), cmp_str_age); for (i = 0; i < sz2; i++) { printf("%d ", s[i].age);//!!加点进行访问,不要忘了 } printf("\n");
}
|