• c语言qsort函数使用教程


    1.qsort函数

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

    1.1qsort函数功能

    可以排序任何数据类型

    对 所指向的数组元素进行排,使用函数确定顺序。

    此函数使用的排序算法通过调用指定函数并指向元素的指针作为参数来比较元素。

    该函数不返回任何值,但通过对所定义的数组元素进行重新排序来修改所指向的数组的内容。

    1.2参数介绍

    base : 是待排序数据的起始地址
    size_t num: 待排序数据的元素个数
    size_t size:待排序数据元素的大小(单位)
    int (compar)(const void, const void*):比较两个元素大小的函数指针

    int (compar)(const void, const void*)
    将两个指针p1和p2作为参数(均转换为常量 void*)。该函数通过返回(以稳定和传递的方式)来定义元素的顺序:

    返回值意义
    <0p1指向 的元素小于p2 指向 的元素
    0p1指向 的元素等于p2 指向 的元素
    >0p1指向 的元素大于p2 指向 的元素

    2. qsort函数功能测试

    qsort函数排序整形数据的实现

    #include
    #include
    int cmp_int(const void* p1, const void* p2)//比较两个整形的大小
    //p1和p2代表两个整形的指针
    {
    	//p1和p2是两个要比较元素的地址
    	//if (*(int*)p1 > *(int*)p2)
    	//	return 1;
    	//else if (*(int*)p1 < *(int*)p2)
    	//	return -1;
    	//else
    	//	return 0;
    	//简化
    	return (*(int*)p1 - *(int*)p2);//表示升序
    	//return (*(int*)p2 - *(int*)p1);//如果表示降序只需调换p1和p2的位置
    
    }
    void print(int arr[], int sz)//函数调用打印排序好的数组
    {
    	for (int i = 0; i < sz; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	printf("\n");
    }
    
    int main()
    {
    	int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	qsort(arr, sz, sizeof(arr[0]), cmp_int);
    	print(arr, sz);
    	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

    打印结果
    在这里插入图片描述

    qsort函数排序结构体数据

    #include
    #include
    #include
    struct stu                        //创建结构体
    {
    	char name[20];
    	int age;
    };
    int cmp_name(const void* p1, const void* p2)  //比较两个名字大小
    { 
    	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
    }
    void print(struct stu *s, int sz)
    {
    	int i = 0;
    	for (i = 0; i < sz; i++)
    	{
    		printf("%s %d\n", s[i].name, s[i].age);
    	}
    }
    void test()
    {
    	struct stu s[] = { {"zhangsan",20},{"lisi",55},{"wangwu",40} };
    	int sz = sizeof(s) / sizeof(s[0]);
    	//按照名字比较
    	qsort(s, sz, sizeof(s[0]), cmp_name);
    	print(s, sz);
    }
    int main()
    {
    	test();
    	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

    这里是按照名字记性比较,名字的首字母进行比较,明显z>w>l,大家可以试一试一按照年龄进行比较

    在这里插入图片描述

    3. 冒泡排序思想模拟实现qsort

    #include
    void print(int arr[], int sz)
    {
    	int i = 0;
    	for (i = 0; i < sz; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	printf("\n");
    }
    
    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)(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)
    			//cmp函数传参,传两个待比较数据的地址
    			{
    				//交换
    				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
    				//base的类型为void*,强制转换成char*,这里是一个字节一个字节来交换数据
    			}
    		}
    	}
    }
    
    int cmp_int(const void* e1, const void* e2)//比较两个数据的大小
    {
    	return (*(int*)e1 - *(int*)e2);
    }
    
    
    void test()
    {
    	int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
    	print(arr, sz);
    }
    
    int main()
    {
    	test();
    	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

    qsort底层逻辑是快速排序的方法,bubble_sort是采用冒泡排序的思想
    借鉴了qsort的设计思想:
    设计了bubble_sort,来实现对任意类型数据的排序

  • 相关阅读:
    【Java-LangChain:使用 ChatGPT API 搭建系统-3】评估输入-分类
    如何实现自动化测试?
    大小端总结
    部分聚合平台“真自营 假聚合”?专家:扰乱市场公平秩序
    Go语言基础笔记(二)数组、切片、映射与结构体
    JWT介绍
    Google警告黑客如何滥用日历服务作为隐蔽的C2信道
    React项目中使用zustand状态管理详细教程
    kubernetes学习笔记-ingress-nginx
    这次把怎么做好一个PPT讲清-审美篇
  • 原文地址:https://blog.csdn.net/m0_71659028/article/details/126809744