• 【利用冒泡排序的思想模拟实现qsort函数】


    1.qsort函数

    1.1qsort函数的介绍

    资源来源于cplusplus网站
    在这里插入图片描述

    1.2qsort函数的主要功能

    在这里插入图片描述

    对数组的元素进行排序
    对数组中由 指向的元素进行排序,每个元素字节长,使用该函数确定顺序。
    此函数使用的排序算法通过调用指定的函数来比较元素对,并将指向它们的指针作为参数。
    该函数不返回任何值,但通过重新排序数组的元素(如 所定义)来修改指向的数组的内容。
    等效元素的顺序未定义。

    void qsort (void* base, size_t num, size_t size,
                int (*compar)(const void*,const void*));
    
    • 1
    • 2

    qsort函数有4个参数,第一个是需要比较的元素的地址,第二个是比较的元素的个数,第三个是比较的元素的大小(单位字节),第四个是自定义比较函数的地址(这个是需要使用者自己根据数据类型自己实现的)

    1.3qsort函数的使用举例

    #include 
    //qosrt函数的使⽤者得实现⼀个⽐较函数
    int int_cmp(const void * p1, const void * p2)
    {
     return (*( int *)p1 - *(int *) p2);
    }
    int main()
    {
     int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
     int i = 0;
     
     qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
     for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
     {
     printf( "%d ", arr[i]);
     }
     printf("\n");
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.函数的实现

    2.1主要函数bubble_sort的实现

    void bubble_sort(void* base,size_t sz,size_t 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);//width是比较元素的宽度
    			}
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.2交换函数Swap函数的实现

    void Swap(char* buf1, char* buf2, size_t width)
    {
    	int i = 0;
    	for (i = 0; i < width; i++)
    	{
    		char tmp = *buf1;
    		*buf1 = *buf2;
    		*buf2 = tmp;
    		buf1++;
    		buf2++;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.3bubble_sort函数测试整型数据

    #include
    void Swap(char* buf1, char* buf2, size_t width)
    {
    	int i = 0;
    	for (i = 0; i < width; i++)
    	{
    		char tmp = *buf1;
    		*buf1 = *buf2;
    		*buf2 = tmp;
    		buf1++;
    		buf2++;
    	}
    }
    //自定义比较的函数(以整型为例)
    int cmp_int(const void* e1, const void* e2)
    {
    	return *(int*)e1 - *(int*)e2;
    }
    void bubble_sort(void* base,size_t sz,size_t 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 print1(int* arr,size_t sz)
    {
    	int i = 0;
    	for (i = 0; i < sz; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    }
    //bubble_sort函数测试整型数据
    void Test1()
    {
    	int arr[] = { 3,5,2,4,7,8,6,9,0,1 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	int width = sizeof(arr[0]);
    	bubble_sort(arr, sz, width, cmp_int);
    	print(arr, sz);
    }
    int main()
    {
    	Test1();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    在这里插入图片描述

    2.4bubble_sort函数测试结构体数据

    #include
    #include
    //实现交换的函数
    void Swap(char* buf1, char* buf2, size_t width)
    {
    	int i = 0;
    	for (i = 0; i < width; i++)
    	{
    		char tmp = *buf1;
    		*buf1 = *buf2;
    		*buf2 = tmp;
    		buf1++;
    		buf2++;
    	}
    }
    //定义结构体类型
    struct S
    {
    	char name[20];
    	int age;
    };
    
    //自定义比较函数(结构体数据)
    //1.用名字比较(需要用到字符串比较函数strcmp,头文件)
    //int cmp_stu_by_name(const void* e1, const void* e2)
    //{
    	//return strcmp(((struct S*)e1)->name, ((struct S*)e2)->name);
    //}
    //2.用年龄比较
    int cmp_stu_by_age(const void* e1, const void* e2)
    {
    	return ((struct S*)e1)->age - ((struct S*)e2)->age;
    }
    void bubble_sort(void* base,size_t sz,size_t 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 print2(struct S* arr, size_t sz)
    {
    	int i = 0;
    	for (i = 0; i < sz; i++)
    	{
    		printf("%s %d\n", arr[i].name, arr[i].age);
    	}
    }
    
    //bubble_sort函数测试结构体数据
    void Test2()
    {
    	struct S arr2[] = { {"zhangsan",27},{"lisi",35},{"wamgwu",31}};
    	int sz = sizeof(arr2) / sizeof(arr2[0]);
    	int width = sizeof(arr2[0]);
    	//bubble_sort(arr2, sz, width, cmp_stu_by_name);//以名字排序
    	bubble_sort(arr2, sz, width, cmp_stu_by_age);//以年龄排序
    	print2(arr2, sz);
    }
    int main()
    {
    	Test2();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    1.用名字比较

    在这里插入图片描述

    2.用年龄比较

    在这里插入图片描述

  • 相关阅读:
    搭建Lua与C/C++交互的环境
    Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单
    native smart contracts, a easy forgotten thing.
    康士柏新能源汽车检测设备-科技之光 驶向未来
    牛客网-《刷C语言百题》第四期
    Prometheus Operator 与 kube-prometheus 之一-简介
    SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则
    智能PDU的“智能”体现在哪些方面?
    原生CLI指令构建npm run减少硬盘node_modules的开销
    猿创征文|【电源专题】案例:怎么用万用表测试静态电流IQ
  • 原文地址:https://blog.csdn.net/qq_73900397/article/details/133419682