内容: 回顾: 七,指向函数指针数组的指针 八,回调函数 print函数就是这个回调函数 qsort函数 冒泡排序 思路: 相邻两个元素比较,交换 一趟冒泡排序后最大值一定来到相应的位置上 一共需要sz-1趟冒泡排序 每次需要比较sz-1-i次 代码实现: void*指针可以接收任意一个类型的地址 但是不知道,存储的地址所指向的变量类型 所以不能解引用操作,也不能跳空间使用 qsort函数的使用 注意: 返回值只有int类型的<0,>0,=0 强制类型转换后即可使用解引用操作符 函数调用 总之:qsort的使用 qsort(数组名,数组的元素个数,每个数组元素所占的字节大小,相邻两数的比较函数) 比较int类型的数据 比较float类型的数据 返回值只能是int类型的 注意强制类型转换 或者写为 结构体中的数字类型的比较 结构体中的字符类型的比较 比较的是字符串 比较字符类型的数据 比较的是字符 利用回调函数模拟实现qsort函数
#include <stdlib.h>
#include <stdio.h>
int compare_int(void* e1, void* e2)
{
return *(int*)e1 - *(int*)e2;
}
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 my_qsort(void* base, int sz, int width, int(*cmp)(void* e1, 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);//相邻两元素的交换
}
}
}
}
int main()
{
int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr, sz, sizeof(arr[0]), compare_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
九,数组面试题的解析