【C语言】qsort函数的使用

news2024/11/20 0:34:51

👑个人主页:啊Q闻       

🎇收录专栏:《C语言》           

 🎉道阻且长,行则将至

前言 

这篇博客主要是介绍qsort函数的使用,以及利用冒泡排序的方式模拟实现qsort

一.初识qsort函数 

我们可以在qsort - C++ Reference (cplusplus.com)了解到qsort函数,我们发现

void*base是指要排序的数组中的第一个元素,利用void*是因为void*为泛指型指针,所以不论什么类型都可以接收,这也正是qsort函数的一大好处,qsort函数可以实现任意类型函数的排序

size_t num是指数组中的元素个数

size_t size是指指向中的元素的大小

int(*compar)(const void*,const void*)则是需要使用者自己创造一个函数实现数组中元素的大小比较,当返回值大于0时,前者大于后者,当返回值小于0时,前者小于后者,当返回值为0时,前者等于后者。 

 二.利用qsort函数排序

1.使用qsort函数排序整型数据

#include<stdio.h>
int int_cmp(const void* p1, const void* p2)
{
	return(*(int*)p1 - *(int*)p2);//详解1
}
int main()
{
	int arr[] = { 1,3,5,6,7,2,4,9,8,0};
	int i = 0;
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), int_cmp);
	for (i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
 }

 详解1:void*的指针不可以直接进行指针的加减整数和解引用的计算,所以在这里我们要强制性转换int*。

2.利用qsort函数排序结构数据 

因为结构体中有不只有一个成员,所以要相同的成员之间比较,因此会有多种比较方法 

#include<stdio.h>
#include<string.h>
struct Stu
{
	char name[20];
	int age;
};
int cmp_by_name(const void* p1, const void* p2)//按照名字排序
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p1)->name);
}
int cmp_by_age(const void* p1, const void* p2)//按照年龄排序
{
	return ((struct Stu*)p1)->age-((struct Stu*)p2)->age;
}
void test2()
{
	struct Stu s[] = { {"zhangsan",20},{"lisi",30},{"wangwu",15} };
	qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp_by_name);
	int i = 0;
	for (i = 0; i < sizeof(s) / sizeof(s[0]); i++)
	{
		printf("%s %d  ", s[i].name, s[i].age);
	}
	printf("\n");
}
void test3()
{

	struct Stu s[] = { {"zhangsan",20},{"lisi",30},{"wangwu",15} };
	qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp_by_age);
	int i = 0;
	for (i = 0; i < sizeof(s) / sizeof(s[0]); i++)
	{
		printf("%s %d  ", s[i].name, s[i].age);
	}
}
int main()
{
	test2();
	test3();
	return 0;
}

 详解:因为名字为字符串,所以要用strcmp进行比较。

 三.qsort函数的模拟实现

在这里,我们采用冒泡排序的方式实现qsort 。

1.qsort实现整数排序 

#include<stdio.h>
void int_cmp(const void* p1, const void* p2)
{
	return(*(int*)p1 - *(int*)p2);
}
void Swap(void* p1, void* p2, size_t  size)
{
   int i = 0;
   for (i = 0; i < size; i++)
  {
	char tmp = *((char*)p1+i);
    *((char*)p1+i) = *((char*)p2+i);
    *((char*)p2+i) = tmp;
  }
}
void bubble(void* base, int count, int size, int(*cmp)(const void*, const void*))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < count - 1; i++)
	{
		for (j = 0; j < count - i - 1; j++)
		{

			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}
		
		int main()
		{
			int arr[10] = { 1,3,5,2,4,6,9,8,7,0 };
			int i = 0;
			int sz = sizeof(arr) / sizeof(arr[0]);
			bubble(arr, sz, sizeof(arr[0]), int_cmp);
			for (i = 0; i < sz; i++)
			{
				printf("%d ", arr[i]);
			}
			printf("\n");
			return 0;
		}

 

详解:

 

2.qsort实现结构排序 

 结构体排序类似整型排序,代码放在下方:

 #include<stdio.h>
struct Stu
{
	char name[20];
	int age;
};
int cmp_by_age(void* p1, void* p2)
{
	return((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}
int cmp_by_name(void* p1, void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}
void Swap(void* p1, void* p2, size_t  size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char tmp = *((char*)p1+i);
	*((char*)p1+i) = *((char*)p2+i);
	*((char*)p2+i) = tmp;
    }
}
void bubble(void* base, int count, int size, int(*cmp)(const void*, const void*))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < count - 1; i++)
	{
		for (j = 0; j < count - i - 1; j++)
		{

			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}
		
		int main()
		{
			struct Stu arr[] = { {"zhangsan",18},{"lisi,22"},{"wangwu",11} };
			int i = 0;
			int sz = sizeof(arr) / sizeof(arr[0]);
			bubble(arr, sz, sizeof(arr[0]), cmp_by_age);
			for (i = 0; i < sz; i++)
			{
				printf("%s %d ",arr[i].name,arr[i].age);
			}
			printf("\n");
			return 0;
		}

 谢谢你的阅读,如果对你有帮助的,三连么么么 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1514359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LJXpaper

表1-3引用出现较滞后 1.3文献[42]有问题 如图 如图 如图 如图 &#x1f447; &#x1f447; &#x1f447; &#x1f447; &#x1f447; &#x1f447; &#x1f447; 要不要加连接词&#xff1a;4-11 4-12之间 &#…

数码管的动态显示(二)

1.原理 这个十六进制是右边的dp为高位。 数码管的动态显示&#xff0c;在第一个计数周期显示个位&#xff0c;在第二个周期显示十位&#xff0c;在第三个周期显示百位由于人眼的视觉和数码管的特性&#xff0c;感觉就是显示了234&#xff0c;每个数码管的显示需要从输入的数据里…

AHU 数据库 实验五

【实验名称】 实验5 数据库的数据更新与视图管理 【实验目的】 1. 熟悉数据更新操作的概念与操作类型&#xff1b; 2. 熟练掌握INSERT、UPDATE、DELETE语句的基本语法&#xff1b; 3. 熟练运用INSERT、UPDATE、DELETE语句实现数据的插入、修改与删除…

应对恶意IP攻击的有效方法

在当今数字化时代&#xff0c;网络攻击已经成为了互联网安全的重大挑战之一。恶意IP攻击是网络安全领域中的一种常见威胁&#xff0c;它可能导致数据泄露、服务中断、系统瘫痪等严重后果。因此&#xff0c;有效地应对恶意IP攻击至关重要。IP数据云将深入探讨如何应对恶意IP攻击…

OpenHarmony开源项目—工程管理

DevEco Studio的基本使用&#xff0c;请参考DevEco Studio使用指南。本章主要介绍如何使用DevEco Studio进行多设备应用开发。 说明&#xff1a; 本章的内容基于DevEco Studio 3.1.1 Release版本进行介绍&#xff0c;如您使用DevEco Studio其它版本&#xff0c;可能存在文档与产…

Oracle PL/SQL Programming 第9章:Numbers 读书笔记

总的目录和进度&#xff0c;请参见开始读 Oracle PL/SQL Programming 第6版 本章谈3点&#xff1a; 可使用的数字数据类型如何在数字和文本间转换PL/SQL 内置数值函数 Numeric Datatypes NUMBER&#xff1a;平台无关的实现&#xff0c;适合处理货币金额PLS_INTEGER 和 BINA…

HBuilder发行微信小程序

首先需要完善mainifest.json中的基本配置 这个需要组测dcloud才可以获取&#xff0c;注册后点击重新获取就可以。 然后发行前还需要完成dcloud的信息&#xff0c;这个他会给你网址 点击连接完成信息填写就可以了 然后就可以发行了。 发行成功后会自动跳转微信小程序&#xff…

uniapp封装统一请求(get和post)

uniapp封装请求 request.js文件 import Vue from vue // 全局配置 import settings from ./settings.js function computedBaseUrl(url) {// console.log(url);return (url.indexOf(http) -1 ? settings.baseUrl : ) url }// 发送请求 export default (options) > {const…

一.java介绍和idea基础使用

java技术体系 Java技术体系说明Java SE(Java standard Edition):标准版Java技术的核心和基础Java EE(Java Enterprise Edition):企业版企业级应用开发的一套解决方案Java ME(Java Micro Edition):小型版针对移动设备应用的解决方案&#xff08;认可少&#xff0c;主要是安卓和…

基于Vue移动端电影票务服务APP设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 Vue框架 3 1.2 数据库MongoDB 3 1.3 Axios请求 3 1.4 H5、CSS3和JavaScript 4 1.5 本章小结 4 2 系统分析 5 2.1 功能需求 5 2.2 用例分析 5 2.3 用户功能 6 2.4本章小结 6 3 基于Vue电影票务服务APP设计 7 3.1 页面设计 …

Java_8 移除元素

移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

微信小程序之表单组件

1、button 常用的属性&#xff1a; 属性类型默认值必填说明sizestringdefault否按钮的大小 合法值说明default默认大小mini小尺寸typestringdefault否按钮的样式类型 合法值说明primary绿色default白色warn红色plainbooleanfalse否按钮是否镂空&#xff0c;背景色透明disable…

Transformer原理

在《机器学习综述》中大致罗列人工智能常见算法&#xff0c;近些年深度学习发展快速&#xff0c;其中Transformer为甚&#xff0c;其英文的意思是变形金刚&#xff0c;对的就是我们看电影变形金刚的意思。Transformer是大语言模型的基础&#xff0c;比如现在常见的GPT、Bert、P…

详解Python中%r和%s的区别及用法

首先看下面的定义&#xff1a; %r用rper()方法处理对象 %s用str()方法处理对象 函数str() 用于将值转化为适于人阅读的形式&#xff0c;而repr() 转化为供解释器读取的形式&#xff08;如果没有等价的语法&#xff0c;则会发生SyntaxError 异常&#xff09; 某对象没有适于人…

数据库增删改查以及联合查询——数据库——day1

今天学习了数据库的知识 首先数据库分为关系型数据库和非关系型数据库 关系型数据库:Mysql OracleSqlServerSqlite 非关系型数据库&#xff1a;RedisNoSQL我们首先来看一下数组、链表、文件、数据库的区别 数组、链表: 内存存放数据的方式(代码运行结束、关机数据丢失) …

JS数组相关知识

获取数组的最大值/最小值&#xff1a; let arrary [2,5,4] let max arrary[0] for(let i 0;i<arrary.length;i){if(arrary[i]>max){max arrary[i]} }console.log(max);//查询数组最小值let arr [2,21,34,23,45] let min arr[0] for(let i 0;i<arr.length;i){if…

“我快无聊死了”用英语怎么说?柯桥英语口语学习,成人零基础学外语

每日一句 Im bored to death. 我快无聊死了。 单词解析&#xff1a; bored / bɔːd / adj.无聊的&#xff0c;厌倦的 bored to d15857575376eath&#xff1a;指非常无聊或厌烦&#xff0c;达到了极点的程度。 "bored" 和 "boring" 都与无聊相关&#…

蓝桥杯练习系统(算法训练)ALGO-980 斐波那契串

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;10.0s Java时间限制&#xff1a;30.0s Python时间限制&#xff1a;50.0s 问题描述 斐波那契串由下列规则生成&#xff1a;   F[0] "0";   F[1] "1";   F[n] F[n-1] F[n-2]…

AI人工智能改变项目管理及控制的5种方式,最后一个你认同吗?

前言 斯蒂芬霍金说&#xff1a;“AI is likely to be either the best or the worst thing to happen to humanity. 人工智能可能是发生在人类身上的最好或最坏的事情”。根据Gartner的说法&#xff0c;它将是前者。它预测到2020年&#xff0c;人工智能将减少1万个就业机会&am…

软件设计师15--进程资源图

软件设计师15--进程资源图 考点1&#xff1a;进程资源图例题&#xff1a; 考点1&#xff1a;进程资源图 例题&#xff1a; 1、在如下所示的进程资源图中&#xff0c;D&#xff09;。 A、P1、P2、P3都是非阻塞节点&#xff0c;该图可以化简&#xff0c;所以是非死锁的 B、P1、…