1.qsort函数是函数库中自带的排序函数(从小到大排序),头文件
2.声明:void qsort(void* base,size_t num,size_t width,
int(* compar)(const void*,const void*));
(1):base:指向排序数组中的第一个元素的指针。
(2):num:数组中的元素个数.
(3):width:数组中每个元素的大小,以字节为单位。
(4):compar:作用是用来比较2个元素,即函数指针(回调函数),参数为2个(viod*)类型
3.回调函数:通过函数指针调用的函数,如果把函数的地址作为参数传递给另一个函数,
当这个指针被用来调用其所指向的函数时,可称为回调函数。
4.int compar(const void *e1,const void* e2);
(1)如果compar返回值小于0,那么e1所指向的元素小于e2所指向的元素,不发生交换。
(2)如果compar返回值等于0,那么e1所指向的元素等于e2所指向的元素,不发生交换。
(3)如果compar返回值大于0,那么e1所指向的元素大于e2所指向的元素,发生交换。
5.模拟实现qsort函数
#include
#include
void swap(char* e1, char* e2, int width)//以每个字节进行交换
{
for (int i = 0; i < width; i++)
{
char tmp = *e1;
*e1 = *e2;
*e2 = tmp;
e1++;
e2++;
}
}
int cmp_int(const void* e1, const void* e2)//比较大小,以返回值判断是否进行交换
{
return (*(int*)e1 - *(int*)e2);
}
void My_qsort(void* arr, int sz, int width, int (*cmp)(const void* e1, const void* e2))
{
int i = 0;
for (i = 0; i < sz-1; i++)
{
int j = 0;
for (j = 0; j < sz - i - 1; j++)
{
if (cmp((char*)arr + j * width, (char*)arr + (j + 1) * width)>0)
{
swap((char*)arr + j * width, (char*)arr + (j + 1) * width, width);
}
}
}
}
void print(int* arr, int sz)//对排序完成的数组进行打印
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
My_qsort(arr, sz, sizeof(arr[0]), cmp_int);
print(arr, sz);
return 0;
}
6.使用qsort函数排序各种类型
#include
#include
#include
struct stu
{
int age;
char name;
double score;
};
//int类型判断
int cmp_int(const void* e1, const void* e2)
{
return (*(int*)e1 - *(int*)e2);
}
//float类型判断
int cmp_float(const void* e1, const void* e2)
{
//return (int)(*(float*)e1 - *(float*)e2);丢失数据,结果错误
return *(float*)e1 > *(float*)e2 ? 1 : -1;
}
//结构体(int)类型判断
int cmp_struct_age(const void* e1, const void* e2)
{
return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
//结构体(char)类型判断
int cmp_struct_name(const void* e1, const void* e2)
{
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
//结构体(double)类型判断
int cmp_struct_score(const void* e1, const void* e2)
{
return ((struct stu*)e1)->score > ((struct stu*)e2)->score ? 1 : -1;
}
//打印int类型数组
void print1(int* arr1, int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
}
//打印float类型数组
void print2(float* arr2, int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%.1f ", arr2[i]);
}
printf("\n");
}
void test1()
{
int arr1[] = {1,2,3,1,3,4};
int sz = sizeof(arr1) / sizeof(arr1[0]);
qsort(arr1, sz, sizeof(arr1[0]), cmp_int);
print1(arr1, sz);
}
void test2()
{
float arr2[] = {3.8,2.3,7.7,3.9,1.9};
int sz = sizeof(arr2) / sizeof(arr2[0]);
qsort(arr2, sz, sizeof(arr2[0]), cmp_float);
print2(arr2, sz);
}
void test3()
{
struct stu arr3[3] = { {"lin",18,5.20},{"qin",19,3.80},{"yan",20,2.50} };
int sz = sizeof(arr3) / sizeof(arr3[0]);
qsort(arr3, sz, sizeof(arr3[0]), cmp_struct_age);
qsort(arr3, sz, sizeof(arr3[0]), cmp_struct_name);
qsort(arr3, sz, sizeof(arr3[0]), cmp_struct_score);
}
int main()
{
test1();//int类型
test2();//float类型
test3();//结构体类型
return 0;
}