赤炼、霸王 发表于 2021-9-7 13:56:25

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]
查看完整版本: C语言篇 + 指针进阶练习 + qsort模拟实现(回调函数思想) + 指针和数组笔试