qsort - 库函数 - 排序
quick sort 快速排序
int main()
{
//指针数组
int* arr[10];
//数组指针
int* (*pa)[10] = &arr;
//函数指针
int (*pAdd)(int , int) = Add;
int sum = pAdd(1, 2);
//函数指针的数组
int (*pArr[5])(int ,int);
//指向函数指针数组的指针
int (*(*ppArr)[5])(int ,int) = &pArr;
return 0;
}
这是库函数qsort的定义
void qsort (void* base,
size_t num,
size_t size,
int (*compar)(const void*,const void*)
);
这是普通的冒泡排序,只能排序整数,而qsort函数可以排序任意类型
void bubble_sort(int arr[], int sz)
{
int i = 0;
for(i = 0;i<sz-1;i++)
{
int j = 0;
for(j =0; j<sz-1-i ;j++)
{
if(arr[j]>arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
qsort函数的使用
int cmp_int(const void* e1, const void* e2)
{
//比较两个整型
return *(int*)e1 - *(int*)e2;
}
int cmp_float(const void* e1, const void* e2)
{
//比较两个浮点型
if(*(float*)e1 == *(float*)e2)
return 0;
else if(*(float*)e1 > *(float*)e2)
return 1;
else
return -1;
}
void test1()
{
int arr[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for(i =0;i<sz;i++)
{
printf("%d ", arr[i]);
}
}
void test2()
{
float f[] = {9.0, 8.0, 7.0, 6.0, 5.0, 4.0};
int sz = sizeof(f) / sizeof(f[0]);
qsort(f, sz, sizeof(f[0]), cmp_float);
int i = 0;
for(i =0;i<sz;i++)
{
printf("%f ", f[i]);
}
}
typedef struct Stu
{
char name[20];
int age;
}Stu;
int cmp_stu_by_age(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int cmp_stu_by_name(const void*e1, const void* e2)
{
//比较名字就是比较字符串
//比较字符串不能直接用><=去比较,要用strcmp
return strcmp(((struct Stu*)e1)->name , ((struct Stu*)e2)->name);
}
void test3()
{
Stu s[3] = {{"张三", 20}, {"李四", 30}, {"王五", 10}};
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
int i = 0;
for(i =0;i<sz;i++)
{
printf("%d ", s[i].age);
}
}
自己写qsort函数
int cmp_int(const void* e1, const void* e2)
{
//比较两个整型
return *(int*)e1 - *(int*)e2;
}
int cmp_stu_by_age(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
void Swap(char* buf1, char* buf2, int width)
{
int i = 0;
for(i =0;i<width ;i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
//程序员不知道待排序的类型,也不知待比较的两个元素的类型
void bubble_sort(void* base, 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-1-i ;j++)
{
//两个元素比较
if(cmp((char*)base+j*width, (char*)base+(j+1)*width) >0)
{
//交换
Swap((char*)base+j*width, (char*)base+(j+1)*width, width);
}
}
}
}
void test4()
{
int arr[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
}
void test5()
{
Stu s[3] = {{"张三", 20}, {"李四", 30}, {"王五", 10}};
int sz = sizeof(s) / sizeof(s[0]);
bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}