C语言---qsort的介绍和模拟实现

简介: C语言---qsort的介绍和模拟实现

在这里插入图片描述

🚀write in front🚀
📝个人主页:认真写博客的夏目浅石.
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:凡人修C传
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️==如果无聊的话,就来逛逛我的博客栈吧==


前言

今天给大家介绍C语言中一个比较好用的函数qsort函数以及我们模拟实现qsort函数的过程。


提示:以下是本篇文章正文内容,下面案例可供参考

一、qsort函数介绍

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
这里是qsort函数的介绍,在下面简单的给大家翻译介绍一下

二、qsort的作用

首先最上面说到它的作用,执行一个快速排序,qsort函数是一个排序函数,它的底层排序算法是快速排序

想要了解快速排序的可以去这里学习,链接已经附上,快去学习吧~

三、qsort的参数

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );`

接着就是它的返回值和参数,我们可以看到这长长的一串,看着就头疼,不过也没大家想象的那么复杂,给大家介绍一下大家就明白了。

首先看我们的第一个参数base,就是一个我们待排序的数组,接着就是num,顾名思义就是我们数组元素的的大小,待排序元素的个数,然后就是width参数,也就是我们待排元素中每个元素的大小,最后就是int (__cdecl *compare )(const void *elem1, const void *elem2 )这是一个回调函数,其中compare是一个函数指针,函数的两个参数分别是elem1elem2(类型是void*)返回值是int类型,最后qsort的返回类型是void型。

四、qsort的用法

4.1排序整形数组

#include<stdio.h>
#include<stdlib.h>
//整数的比较
int cmp1(const void* e1, const void* e2)
{
   
    return *((int*)e1) - *((int*)e2);
}
//测试整数
void test1()
{
   
    int arr[5] = {
    5,4,3,2,1 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(arr[0]), cmp1);
    for (int i = 0; i < 5; i++)
    {
   
        printf("%d ", arr[i]);
    }
    printf("\n");

}
int main()
{
   
    test1();
    return 0;
}

在这里插入图片描述

4.2排序其他类型

//浮点数的比较
int cmp2(const void* e1, const void* e2)
{
   
    return *((double*)e1) - *((double*)e2);
}
//字符的比较
int cmp3(const void* e1, const void* e2)
{
   
    return *((char*)e1) - *((char*)e2);
}
//字符串的比较
int cmp4(const void* e1, const void* e2)
{
   
    return strcmp(*(char**)e1, *(char**)e2);
}
//结构体数字比较
int cmp5(const void* e1, const void* e2)
{
   
    return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//结构体字符串比较
int cmp6(const void* e1, const void* e2)
{
   
    return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}

五、模拟实现qsort函数

由于目前考虑让更多人理解qsort函数的使用,所以博主就打算带着大家,利用泡泡排序的思路来详细讲解qsort

5.1主函数书写

int main()
{
   
    int arr[]={
   9,8,7,6,5,4,3,2,1,0};

    int sz=sizeof(arr)/sizeof(arr[0]);

    //四个参数对标qsort的四个参数
    bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);

    for(int i=0;i<sz;i++)
    {
   
        printf("%d ",arr[i]);
    }

    return 0;
}

5.2泡泡排序的书写

void bubble_sort(void* base,int sz,int width,int (cmp_int)(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_int((char*)base+j*width,(char*)base+(j+1)*width)>0)
            {
   
                Swap((char*)base+j*width,(char*)base+(j+1)*width,width);
            }
        }
    }
}

在这里插入图片描述

5.3比较函数和交换函数的实现

int cmp_int(const void* e1,const 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++;
    }
}

在这里插入图片描述

5.4整形数组排序的总代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int cmp_int(const void* e1,const 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 bubble_sort(void* base,int sz,int width,int (cmp_int)(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_int((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[]={
   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);

    for(int i=0;i<sz;i++)
    {
   
        printf("%d ",arr[i]);
    }

    return 0;
}

5.5所有类型数组的排序代码总结

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{
   
    int age;
    char name[20];
};
//整数的比较
int cmp1(const void* e1, const void* e2)
{
   
    return *((int*)e1)-*((int*)e2);
}
//浮点数的比较
int cmp2(const void* e1, const void* e2)
{
   
    return *((double*)e1) - *((double*)e2);
}
//字符的比较
int cmp3(const void* e1, const void* e2)
{
   
    return *((char*)e1) - *((char*)e2);
}
//字符串的比较
int cmp4(const void* e1, const void* e2)
{
   
    return strcmp(*(char**)e1, *(char**)e2);
}
//结构体数字比较
int cmp5(const void* e1, const void* e2)
{
   
    return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//结构体字符串比较
int cmp6(const void* e1, const void* e2)
{
   
    return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}

//模拟实现qsort函数
void swap(char* ch1, char* ch2, int sz)
{
   
    for (int i = 0; i < sz; i++)
    {
   
        char tem = *ch1;
        *ch1 = *ch2;
        *ch2 = tem;
        ch1++;
        ch2++;
    }
}
void bubble_sort(void* arr, int num, int size, int (*cmp)(const void* e1, const void* e2))
{
   
    for (int i = 0; i < num; i++)
    {
   
        for (int j = 0; j < num - i - 1; j++)
        {
   
            //cmp((char*)arr + j * size, (char*)arr + (j + 1) * size)
            if (cmp((char*)arr + j * size, (char*)arr + (j + 1) * size))
            {
   
                swap((char*)arr + j * size, (char*)arr + (j + 1) * size, size);
            }
        }
    }
}
//测试整数
void test1()
{
   
    int arr[5] = {
    5,4,3,2,1 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz, sizeof(arr[0]), cmp1);
    for (int i = 0; i < 5; i++)
    {
   
        printf("%d ", arr[i]);
    }
    printf("\n");

}

//测试浮点数
void test2()
{
   
    double arr[5] = {
    2.5,2.3,3.8,6.1,0.2 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz, sizeof(arr[0]), cmp2);
    for (int i = 0; i < 5; i++)
    {
   
        printf("%.1lf ", arr[i]);
    }
    printf("\n");
}
//测试字符
void test3()
{
   
    char arr[5] = {
    'e','f','o','a','q' };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz, sizeof(arr[0]), cmp3);
    for (int i = 0; i < 5; i++)
    {
   
        printf("%c ", arr[i]);
    }
    printf("\n");
}
//测试字符串
void test4()
{
   
    char* arr[] = {
    "shan","huani","ajfie","deygufefb" };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz, sizeof(arr[0]), cmp4);
    for (int i = 0; i < sz; i++)
    {
   
        printf("%s ", arr[i]);
    }
    printf("\n");
}
//测试结构体中的排序
void test5()
{
   
    struct Stu arr[4] = {
    {
   11,"uheriu"},{
   37,"iuehen"},{
   8,"aouenioon"},{
   22,"ming"} };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz, sizeof(arr[0]), cmp5);
    for (int i = 0; i < sz; i++)
    {
   
        printf("%d ", arr[i].age);
    }
    printf("\n");
    bubble_sort(arr, sz, sizeof(arr[0]), cmp6);
    for (int i = 0; i < sz; i++)
    {
   
        printf("%s ", arr[i].name);
    }
}
int main()
{
   
    test1();
    test2();
    test3();
    test4();
    test5();
    return 0;
}

总结

我是夏目浅石,希望和你一起学习进步,刷题无数!!!希望各位大佬能==一键三连==支持一下博主,hhhh~我们下期见喽

在这里插入图片描述
==如果无聊的话,就来逛逛我的博客栈吧==

✨$\textcolor{blue}{原创不易,还希望各位大佬支持一下}$

👍 $\textcolor{9c81c1}{点赞,你的认可是我创作的动力!}$

⭐️ $\textcolor{ed7976}{收藏,你的青睐是我努力的方向!}$

✏️ $\textcolor{98c091}{评论,你的意见是我进步的财富!}$

相关文章
|
7月前
|
C语言
C语言-----qsort函数的功能以及模拟实现
C语言-----qsort函数的功能以及模拟实现
64 1
|
7月前
|
搜索推荐 C语言
c语言从入门到实战——回调函数与qsort的讲解和模拟实现
回调函数是一个函数,它作为参数传递给另一个函数,并且能够在该函数内部被调用。在C语言中,回调函数通常被用于实现事件处理和排序算法中。 `qsort`是C标准库中的一个排序函数,它可以对任意类型的数组进行排序。`qsort`需要三个参数:要排序的数组、数组元素的个数和一个指向回调函数的指针。回调函数必须满足两个条件:能够比较数组中的元素,返回一个整数表示它们之间的大小关系;并且它应该能够被`qsort`函数调用。 回调函数是一种在编程中广泛使用的技术,它允许一个函数作为参数传递给另一个函数,并在需要时被调用。这种机制使得代码更加灵活和可重用。
70 0
|
7月前
|
C语言
c语言进阶部分详解(经典回调函数qsort()详解及模拟实现)
c语言进阶部分详解(经典回调函数qsort()详解及模拟实现)
75 0
|
算法 编译器 C语言
【C语言】指针的进阶(三)—— 模拟实现qsort函数以及指针和数组的笔试题解析
【C语言】指针的进阶(三)—— 模拟实现qsort函数以及指针和数组的笔试题解析
46 0
|
2月前
|
算法 搜索推荐 C语言
【C语言篇】深入理解指针4(模拟实现qsort函数)
【C语言篇】深入理解指针4(模拟实现qsort函数)
27 2
|
2月前
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
29 0
|
7月前
|
编译器 C语言
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(下)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
47 0
|
2月前
|
搜索推荐 C语言
深入浅出理解 C 语言中的 qsort 函数
深入浅出理解 C 语言中的 qsort 函数
|
6月前
|
搜索推荐 C语言
c语言qsort函数的模拟实现
c语言qsort函数的模拟实现
32 1
|
6月前
|
算法 搜索推荐 C语言
深入了解C语言的qsort函数:原理及相关知识
深入了解C语言的qsort函数:原理及相关知识
91 1