qsort函数(C语言)_qsort函数代码_川入的博客-程序员秘密

技术标签: c语言  

目录

介绍:

不同类型

        struct Stu(对比字符串):

        int:

        char:


介绍:

qsort()函数是 C 库中实现的快速排序算法,包含在 stdlib.h 头文件中。函数原型如下:

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

此函数需要四个参数。

 对于比较函数,因比较形式的多量化,所以作者就将比较函数交给书写者自行进行编译书写。(以整数类型数组排序举例)

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

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

int cmp_int(const void* e1, const void* e2)
{
	return (int*)e1 - (int*)e2;
}

int main()
{
	int arr[3] = { 3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print(sz, arr);
	return 0;
}

注:

  • cmp_int即为,为了进行整数数组的排序所进行的函数大小比较。
  • qsort对我们所传入的数据判断,以我们所写的来进行断定。
    int (__cdecl *compare )(const void *elem1, const void *elem2 ) 

        对此,我们知道qsort是一个运用,快排的方式,使得一串数据以低到高,如果,我们需要以高到低呢,这就需要反思维了,我们须知,以低到高,是有与前者大于后者即换,反之不换。那我们就反过来,后者大于前者即换,反之不换。那我们是不是就得到了一串有高到低的数据,于是我们将"e1 - e2";变为"e2 - e1"即可。以上者代码为例,我们将其变为如此即可:

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

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

int cmp_int(const void* e1, const void* e2)
{
	return (int*)e2 - (int*)e1; //重点变化点
}  //-------------------------------

int main()
{
	int arr[3] = { 3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print(sz, arr);
	return 0;
}

不同类型

        struct Stu(对比字符串):

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

struct Stu
{
	char name[20];
	int age;
};

int cmp_struct_Stu(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}

int main()
{
	struct Stu arr[3] = { {"zhangsan", 20},{"lisi", 30},{"wangwu", 10} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s,%d   ", (arr[i]).name, (arr[i]).age);
	}
	printf("\n");
	return 0;
}

        int:

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

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

int cmp_int(const void* e1, const void* e2)
{
	return (int*)e1 - (int*)e2;
}

int main()
{
	int arr[3] = { 3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print(sz, arr);
	return 0;
}

        char:

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

int cmp_char(const void* e1, const void* e2)
{
	int n = (*(char*)e1 - *(char*)e2);
	return (*(char*)e1 - *(char*)e2);
}

void print(int sz, char arr[])
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%c ", arr[i]);
	}
	printf("\n");
}

int main()
{
	char arr[3] = { 'b','a','c'};
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print(sz, arr);
	return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_64609308/article/details/123554800

智能推荐

电脑硬件知识入门之机械键盘篇,android入门基础_电脑都有哪些轴_m0_65320833的博客-程序员秘密

相对于普通薄膜键盘来说,机械键盘的敲击声音大是它的一大缺点,但也有好的静音机械键盘,这个就比较昂贵了。而普通薄膜键盘一般来说敲击声音都很小。3.机械键盘的分类机械键盘可分为茶轴、青轴、白轴、黑轴以及红轴。正是由于每一个按键都由一个独立的微动组成,因此按键段落感较强,从而产生适于游戏娱乐的特殊手感,故而通常作为比较昂贵的高端游戏外设,亦是程序员的标准设备。那么每种轴都有什么特点 及适合使用的情况是什么呢?①黑轴黑轴被称为最原始最纯粹的机械轴,有着超短触发距离与最长使用寿命。机械感直爽:从顶部到底部

金币能力UVA11292:Dragon of Loowater_weixin_33786077的博客-程序员秘密

每日一贴,今天的内容关键字为金币能力    题意:恶龙有n个头,每个头直径x,国王可以雇佣m个骑士,每个骑士能力为y,能砍半径y的头,雇佣金为y,不能重复雇佣,问最少能消费多少金币    思路:对两者停止排序,然后停止比拟相加便可     每日一道理 闷热的天,蝉儿耐不住寂寞地不停在鸣叫,我孤单一人,寂静的身旁没有一个知音,想疯狂地听摇滚乐,听歇斯底里的歌声,那只为逃避无人的世...

SAP MRP MD04运行结果展示_梧桐小海的博客-程序员秘密

需求:内容是MD04中需求和库存的内容。MD04将一个物料显示了一张表,我们现在需要的是一个物料一行的表。        你可以使用function:MD_STOCK_REQUIREMENTS_LIST_API。输入物料号工厂号,他下面所有的表头和行项目信息全部都会取出来。你只需要把function返回给你的信息组织一下,选取一部分放到报表就可以了。         选择屏幕输入:

LeetCode算法详解(一)--Two Sum_public int[] twosum(int[] nums, int target) 是什么意思_QINGXIA_csdn的博客-程序员秘密

这个题目的目的就是给定数组以及目标和,找出数组中和为给定目标的两个数并且输出,要求是每个数只能使用一次,且输出的为两个数在数组中的位置。比较容易想到的方法是遍历数组中的所有数字,此种方法时间复杂度比较高O(n^2),代码如下:class solution{public: int[] twosum(int[] nums,int target){ int len = nums.length;...

定时任务采用 redis分布式锁结合并Aop_summer2233的博客-程序员秘密

项目中经常用到定时任务,而且在生产环境中定时任务工程往往会部署在多个节点上,就会出现定时任务重复执行的问题。 既要避免定时任务单节点部署,又要同一时刻防止重复执行定时任务, 可以使用redis的分布式锁,为定时任务唯一指定的key加锁,并设置锁超时时间。当触发定时任务时,第一台服务获取到锁,并设置较长的过期时间,执行定时任务方法。第二台服务设置锁的时候发现该锁已存在返回fals...

随便推点

英语发音规则---U字母-[复习中]_weixin_30287169的博客-程序员秘密

英语发音规则---U字母一、总结一句话总结:(注:本文所有//的音标为英音音标,[]的音标为美音音标)1、U在开音节中发[ju]/ju:/?duty /'djuːtɪ/ ['dʊti] n. 责任huge /hju:dʒ/ [hjudʒ] adj.巨大的music /ˈmju:zɪk/ [ˈmjuzɪk] n.音乐puma /ˈ...

计算机信息 专业院校,四川高考的计算机专业分数排名,电子科大、华科进入A类前20名..._俗人子逸的博客-程序员秘密

作者:东方雨虹老师,深耕教育领域的创作者。教育专业领域的原创作品版权归属于作者。注重励志教育,博览理想人生。在2021年高考招生录取工作之中,提起投档分数线快速提升的热门专业,大部分考生都会说“计算机专业真热”。只要和计算机专业沾上边,专业投档线在此类院校之中,一般都属于中上层次。比如电子科技大学在不同高考省份的投档线,一般而言,电子信息类(成电英才计划拔尖创新人才实验班)的投档线最高,毕竟此类专...

spring初始化后获取自定义注解bean_spring bean初始完成后注解_一日立三金的博客-程序员秘密

目的是通过注解将特定类的信息(如接口编号)与类关联,之后可通过接口编号获取对应bean来执行对应逻辑。1.新建注解类:@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@[email protected] @interface ServiceCode {...

python模块paramiko与ssh安装配置教程_paramico配置sh_程序员如山石的博客-程序员秘密

paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接了,下面我们就来给各位一起验证一下python模块paramiko与ssh安装与使用示例吧。一、paramiko模块的安装paramiko模块依赖PyCrypto模块,而PyCrypto需要GCC库编译,不过一般发行版的源里带有该模块。这里以centos6为例,直接借助以下命

cordova学习笔记_cordova插件的使用(camera)_cordova camera_哈哈哈哈哈哈_Y的博客-程序员秘密

之前一篇简单的介绍了项目的创建现在来看一下,cordova的插件如何使用。添加cordova的插件就可以调用手机原生的一些功能或者控件。 首先添加相机插件:cordova plugin add cordova-plugin-camera 具体如何使用呢? <div class="app"> <div class="divUpload"> <input type="

聚类一之距离聚类_zhao_crystal的博客-程序员秘密

1. 聚类的定义聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小。2. 聚类的应用2.1 降维对于M篇文章,D1, D2, D3 …… Dm,假设已做好分词。根据这M篇文章,得到一个词典word_dict = {W1, W2, W3, W4……Wv},假设共有v个词。方式1: 0,1 矩阵(0代表没有出现过,1代表出现过)若D1中出现过W1,则将相应位置置为1,否则置为0。其它同理。——&gt;m纬..

推荐文章

热门文章

相关标签