#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//void qsort(void* base, //要排序的数组的地址
// size_t num, //base 指向的数组中元素的个数
// size_t width, //数组中每个元素的大小,以字节为单位
// int(*compare)(const void*, const void*)); //用来比较两个元素的函数,即函数指针(回调函数),返回值为int

struct stu
{
char name[20];
float grade;
};
int cmp_char(const void* e1, const void* e2)
{
return strlen((char*)e1) - strlen((char*)e2); //比较字符串长度
}
int cmp_float(const void* e1, const void* e2)
{
return (int)(*(float*)e2 - *(float*)e1); //参数是指针,要解引用操作.这个函数本人用的降序
}
//e1-e2是升序,如果要降序:e2-e1
int cmp_stu_grade(const void* e1,const void* e2)
{
return (int)(((struct stu*)e1)->grade - ((struct stu*)e2)->grade);
}
int cmp_stu_name(const void* e1,const void* e2)
{
return strcmp(((struct stu*)e1)->name,((struct stu*)e2)->name); //比较字符串大小
}
int main()
{
int i;
struct stu s[3] = { {"luosheng",100.0},{"dinghuaiyu",99.0},{"fuyan",98.0}};
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_stu_grade);
printf("按成绩排序:\n");
for (int i = 0; i < sz; i++)
{
printf("%s\t", s[i].name);
printf("%.1f\n", s[i].grade);
}

qsort(s, sz, sizeof(s[0]), cmp_stu_name);
printf("\n按名字排序:\n");
for (i = 0; i < sz; i++)
{
printf("%s\t",s[i].name);
printf("%.1f\n", s[i].grade);
}

float f[] = { 10.0,5.0,9.0,8.0 };
int ys = sizeof(f) / sizeof(f[0]);
qsort(f, ys, sizeof(f[0]), cmp_float);
printf("\n按降序排序\n");
for ( i = 0; i < ys; i++)
{
printf("%.1f\t", f[i]);
}

char Id[5][20] = { "dinghuaiyu","fuyan","lichunyan","yangqianyun","waiwai" };
int dx = sizeof(Id) / sizeof(Id[0]); //dx=5
qsort(Id, dx, sizeof(Id[0]), cmp_char);
printf("\n\n按长度排序:\n");
for ( i = 0; i < dx; i++)
{
printf("%s\n", Id[i]);
}
return 0;
}