C语言篇 + 指针进阶练习 + qsort模拟实现(回调函数思想) + 指针和数组笔试
目录
[*]前言
[*]冒泡排序
[*]了解qsort
[*]c语言库qsort的使用
[*]qsort模仿实现
[*]指针和数组笔试题分析
[*]
[*]一维数组
[*]字符数组
[*]二维数组
[*]总结: 数组名的意义
前言
qsort(quicksort)根据你给的比较函数给一个数组快速排序,是通过指针移动实现排序功能,关于qsort的模仿实现,本次在底层的使用的排序算法是使用的冒泡排序,那么就先来了解一下冒泡排序吧,另外作为C/C++程序员我们更应该透彻地去明白指针和数组,这里我准备了几道大题,内容会很出色,等待你的点赞
冒泡排序
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
/* 打印 */
void print(int arr[],int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ",arr);
}
printf("\n");
}
/* 交换 */
void Swap(int *n1,int *n2)
{
int tmp = *n1;
*n1 = *n2;
*n2 = tmp;
}
/* 冒泡算法 */
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 > arr)
{
Swap(&arr,&arr);
}
}
}
}
int main()
{
int arr = {9,8,7,6,5,4,3,2,1,0};
int sz = sizeof(arr) / sizeof(arr);
bubble_sort(arr,sz);
print(arr,sz);
return 0;
} pstrong以上的讲解大家对冒泡排序应该有了一个清晰的认知了,接下来进入我们的主题/strong/p h1a id="qsort_61"/a了解qsort/h1 pimg src="https://img-blog.csdnimg.cn/af9829b7c6f54186b4798d59cbd8d3e6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASVTojqvmiY7nibk=,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" /br / strongcompare使用文档/strongbr / img src="https://img-blog.csdnimg.cn/7ea2424def234bb8bf65dc421d6d0e22.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASVTojqvmiY7nibk=,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" //p void qsort(void *base, //待排序的对象,写成void*的形式便于排序任意类型的数据
size_t num, //待排序的元素个数
size_t width,//一个元素的大小,单位是字节
int(__cdecl *compare)
(const void *elem1, const void *elem2))
{
}
>compare指向排序时用来比较两个元素的函数
> void *无具体类型的指针,能够接受任意类型的地址
> 缺点:不能进行运算,不能解引用
> 举例:void *p3;
> p3++//err 报错信息
c语言库qsort的使用
整形类型数据的排序
void print(int arr[],int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ",arr);
}
printf("\n");
}
int compare_int(const void *elem1, const void *elem2)
{
/* 升序 */
return *(int*)elem1 - *(int*)elem2;
/* 降序 */
//return *(int*)elem2 - *(int*)elem1;
}
int main()
{
int arr = {9,8,7,6,5,4,3,2,1,0};
int n = sizeof(arr) / sizeof(arr);
/* 排序 */
qsort(arr,n,sizeof(arr), compare_int);
/* 打印 */
print(arr, n);
return 0;
} pstrong浮点型型数据的排序/strong/p blockquotep这里要提一句,浮点型数据类型会有精度的丢失,不能直接通过两个形参值相减后直接返回结果,通过关系比较返回符合的整形/p /blockquote int cmp_double(const void* elem1, const void* elem2)
{
return ((*(double*)elem1- *(double*)elem2) > 0)? 1:-1;
}
int main()
{
double a[] = { 1.2,56.4,0.56,456.89,32.4 };
int sz = sizeof(a) / sizeof(a);
qsort(a, sz, sizeof(a), cmp_double);
for (int i = 0; i < sz; i++)
{
printf("%.2f ", a);
}
return 0;
} pstrong结构体类型数据的排序/strong/p typedef struct Student
{
int age;
char name;
float score;
}Stu;
void print(Stu arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%.1f ", arr.score);
}
printf("\n");
}
int compare_name(const void *elem1, const void *elem2)
{
/* 升序,这里比较的是字符串的长度*/
return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);
}
int compare_age(const void *elem1, const void *elem2)
{
/* 升序 */
return ((Stu*)elem1)->age - ((Stu*)elem2)->age;
}
float compare_score(const void *elem1, const void *elem2)
{
/* 升序 */
return ((Stu*)elem1)->score - ((Stu*)elem2)->score;
}
int main()
{
Stu s = { {18,"zhangsan",99.5},{20,"lisi",66.5},{21,"wangwu",76} };
int n = sizeof(s) / sizeof(s);
qsort(s,n,sizeof(s), compare_score);
print(s, n);
return 0;
} qsort模仿实现
typedef struct Student{ int age; char name; float score;}Stu;int compare_name(const void *elem1, const void *elem2){ /* 升序,这里比较的是字符串的长度*/ return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);}/* 输出整形数据 */void print1(int arr[], int sz){ for (int i = 0; i <span class="token operator">
页:
[1]