qsort实现顺序与逆序/排整型,字符串数组,字符数组,结构体类型数组的名字排序,年龄排序等_qsort反向排序-程序员宅基地

技术标签: 经验分享  c语言  数据结构  

目录


前言:通常我们排序都需要创建一个函数实现排序,但当我们排完整型数组时,想要排字符串呢?那需要重新创建一个函数,完善它的功能,进而实现排字符串,这样非常繁琐,但是有一个函数可以帮我们实现传什么,排什么;

qsort的传参:(1️⃣,2️⃣,3️⃣,4️⃣)
首元素地址排序的元素个数每个元素的大小指向比较两个元素的函数的指针

1️⃣2️⃣3️⃣4️⃣的传参方法,下面介绍:

整型数组:

例如:int arr[]={9,8,7,6,5,4,3,2,1}

1️⃣:arr
2️⃣:sizeof(arr)/sizeof(arr[0])
3️⃣:sizeof(arr[0])
4️⃣:Get【这是函数名,具体就是自己设计一个函数,可以判断两个元素大小即可】

int Get(const void*pa1,const void pa2){
    //void就像垃圾桶,什么指针都能接收
return *(类型*)pa1-*(类型*)pa2;//强制转化为类型指针进行运算
}

重点:
如果Get返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面
如果Get返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定
如果Get返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面

下面例题会具体给出Get的形参的创建方法

1.整型数组型排序

#include<stdlib.h>
//qsort会以指针传2个元素,调用这个函数,判断两个元素大小
int cmp_int(const void*e1,const void*e2) {
    //只是比较,加const比较安全
	return *(int*)e1 - *(int*)e2;//元素int型,强制类型转化
}
//打印数组
void print(int *a,int sz) {
    
	int i = 0;
	for (i = 0; i < sz; i++) {
    
		printf("%d\n", *(a + i));
	}
}

int main() {
    

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

	qsort(arr,sz,sizeof(arr[0]), cmp_int);//排序
	print(arr,sz);//打印数组

	return 0;
}

2.字符数组排序

短博客http://t.csdn.cn/rTViD

//比较元素大小
int Get(const void* pa1, const void* pa2) {
    //比较两个元素
	return strcmp((char*)pa1, (char*)pa2);//为什么这里不解引用,这是strcmp的特性,请看上面的短篇博客
}

//打印
void print(int sz, char* pa) {
    
	int i = 0;
	for (i = 0; i < sz; i++) {
    
		printf("%c", *(pa + i));
	}
}

#include<stdlib.h>
#include<string.h>
int main() {
    

	int sz;
	char arr[] = {
     'h','g','f','e','d','c','b','a',0 };//字符数组没有结束标志,需要添加
	sz = strlen(arr);
	
	qsort(arr, sz, sizeof(arr[0]), Get);
	print(sz, arr);

	return 0;
}

3.字符串数组排序

//比较元素
int Get(const void* pa1, const void* pa2) {
    
	return strcmp(*(char**)pa1, *(char**)pa2);
}

//打印
void print(int sz, char** pa) {
    //二级指针接收【有些人可能迷糊了,为什么不是一级指针,下面解释
	int i = 0;
	for (i = 0; i < sz; i++) {
    
		printf("%s ", *(pa + i));
	}
}


#include<string.h>
#include<stdlib.h>
int main() {
    

	int sz;
	char* arr[] = {
    "ef","cd","ab"};//存放多个字符串的地址;
	sz = sizeof(arr) / sizeof(arr[0]);

	qsort(arr,sz,sizeof(arr[0]), Get);
	print(sz,arr);

	return 0;
}

为什么打印用二级指针:我们知道,数组名的地址和首元素的地址一样,取数组名就是取首元素地址,而首元素本身就是一个地址,取地址的地址,存放自然要用二级指针,打印时候,解引用一次,得到一级指针即可打印;

4.结构体数组年龄排序

//结构体
struct Stu {
    
	char name[20];
	int age;
};

//比较元素中的年龄
int Get(const void*e1,const void*e2) {
    
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;//不需要解引用,->已经找到了age
}
//打印
void print(int sz, struct Stu *s) {
    
	for (int i = 0; i < sz; i++) {
    
		printf("%s  %d\n", (s+i)->name, (s+i)->age);
	}
}

#include<stdlib.h>
int main() {
    
	int i = 0;
	struct Stu s[] = {
     {
    "张三",18},{
    "李四",16},{
    "陈五",20} };//数组大小3;可以存放3个变量;
	int sz = sizeof(s) / sizeof(s[0]);
	
	qsort(s,sz,sizeof(s[0]),Get);//排序
	print(sz,&s);//打印

	return 0;
}

5.结构体数组名字排序

//结构体
struct Stu {
    
	char name[20];
	int age;
};

//比较元素大小
int Get(const void* e1,const void* e2) {
    
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//打印
void print(int sz, struct Stu *s) {
    
	for (int i = 0; i < sz; i++) {
    
		printf("%s  %d\n", (s + i)->name, (s + i)->age);
	}
}

#include<string.h>
#include<stdlib.h>
int main() {
    

	struct Stu s[] = {
     {
    "zhangsan",18},{
    "lisi",16},{
    "chenwu",20} };//数组大小3;可以存放3个变量;
				//注意:abcq和adc比较,是a 的Asc码==a,b的Asc码<d,于是adc>abcq												
	int sz = sizeof(s) / sizeof(s[0]);
	
	qsort(s,sz,sizeof(s[0]),Get);
	print(sz,s);

	return 0;
}

数组倒序排


int Get(const void* e1,const void* e2) {
    
	return *(类型*)p2-*(类型*)p1;
	

很简单,元素p1-pa2如果>0,pa1往后排,否则排前面
987654321
倒序:p1(9)-p2(8)结果>0;9往后排
123456789
倒序:p2(2)-p1(1)结果>0;1往后排

注意,qsort会传两个元素过去,它只在乎返回的值是大于0还是小于0;然后判断是否要对两个元素排序
(不管写的好不好,自信总得有,自己收藏自己+1)

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

智能推荐

opentsdb-程序员宅基地

文章浏览阅读57次。为什么80%的码农都做不了架构师?>>> ...

java怎么访问私有类_如何从Java类的外部访问类的私有方法?-程序员宅基地

文章浏览阅读2.6k次。您可以使用java反射包访问类的私有方法。步骤1-通过传递声明为私有的方法的方法名称来实例化java.lang.reflect包的Method类。步骤2-通过将值true传递给setAccessible()方法来设置可访问方法。步骤3-最后,使用invoke()方法调用该方法。示例importjava.lang.reflect.Method;publicclassDemoTest{priv..._私有类型如何访问方法

mysql 6.3 入门_Mysql入门-程序员宅基地

文章浏览阅读224次。简介:数据库的操作:1.用 SHOW 显示已有的数据库show databases 2.创建数据库:create database 创建数据库create database db_name3.删除数据库:drop databse db_name4.use 选定数据库.use db_name 数据表的操作:1.show/de ...数据库的操作:1.用 SHOW 显示已有的数据库show datab..._mysql6.3

用opencv的aruco库生成二维码marker标记_树莓派opencv识别aruco二维码-程序员宅基地

文章浏览阅读1k次。用opencv的aruco库生成二维码marker标记代码来源于官方提供的完整的工作实例create_marker.cpp。在opencv源码中的位置为opencv_contrib-4.4.0/modules/aruco/samples/create_marker.cpp。#include <opencv2/highgui.hpp>#include <opencv2/aruco.hpp>#include <iostream>using namespace cv_树莓派opencv识别aruco二维码

ajax vue写入mysql,vue发送ajax请求详解-程序员宅基地

文章浏览阅读141次。vue本身不支持发送AJAX请求,需要使用vue-resource(vue1.0版本)、axios(vue2.0版本)等插件实现axios是一个基于Promise的HTTP请求客户端,用来发送请求,也是vue2.0官方推荐的,同时不再对vue-resource进行更新和维护本文为大家介绍vue使用axios发送AJAX请求首页安装并引入axios1、npm install axios -S..._vue3 axios 传递 mysql

【技巧】arcgis读取nc格式文件并导出为tif_nc转tif后arcmap不重合-程序员宅基地

文章浏览阅读1.5w次,点赞15次,收藏109次。nc格式数据是遥感领域中常见的一种图像格式,由于其具有灵活性, 能够传输海量的面向阵列(array-oriented)数据, 现在已经成为许多数据采集软件生成文件的格式, 被广泛用于陆地、海洋和大气科学。_nc转tif后arcmap不重合

随便推点

Python初探:turtle(海龟)实现动画_python turtle 动画-程序员宅基地

文章浏览阅读1.2w次,点赞17次,收藏88次。利用Python的turtle库实现一个动画Turtle库是Python内置的图形化模块,是绘制图像的函数库。海龟即屏幕上绘图的光标(小三角形),编写Python指令可以让海龟在屏幕上移动绘制线条,可将海龟看做是坐标系里移动,位置可用坐标表示(x,y)。基于turtle的动画,动画可以理解为由一张张快速切换而成:1、准备工作:设置speed为0(最快,不显示海龟动态);隐藏海龟——h..._python turtle 动画

vim ctrl+v块操作_vim ctrl v-程序员宅基地

文章浏览阅读3.1k次。linux vim块/整行操作快捷键_vim ctrl v

探秘ESP8266与React结合的智能硬件项目:GitCode上的[rjwats/esp8266-react](https://gitcode.com/rjwats/esp8266-react?ut...-程序员宅基地

文章浏览阅读360次,点赞3次,收藏6次。探秘ESP8266与React结合的智能硬件项目:GitCode上的rjwats/esp8266-react项目地址:https://gitcode.com/rjwats/esp8266-react项目简介在物联网(IoT)的世界中,ESP8266是一个著名的低成本、高性能的Wi-Fi微控制器,常被用于构建各种智能家居设备和DIY项目。而React作为前端开发的主流框架,以其组件化和虚拟DO...

arm64以及amd64和龙芯4000下安装pyqt:_generating the c++ source for the qtcore module...-程序员宅基地

文章浏览阅读3.4k次。arm64以及amd64和龙芯4000下安装pyqt:包下载地址:sip安装包地址:https://riverbankcomputing.com/software/sip/downloadqt源码下载 http://download.qt.io/arhive/qt/2.7下安装pyqt5:https://www.cnblogs.com/deeplearning1314/p/10671347.html参考编译链接:linux下安装qt:https://blog.csdn.net/u01452338_generating the c++ source for the qtcore module...error: unable to create th

Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)_pyqt ui转py-程序员宅基地

文章浏览阅读4.3w次,点赞35次,收藏150次。本篇博文讲讲 Qt Creator 使用方法,分享三种将UI界面文件编译为Python文件的方法。_pyqt ui转py

Bugku CTF-Web篇writeup 3-11_ctf 3-11-程序员宅基地

文章浏览阅读1.2k次,点赞4次,收藏6次。Flask_FileUpload由题目名得知的信息,显然是个文件上传的题目,flask:一种python的web框架首先Ctrl+U查看页面源代码,一般能看到题目提示支持jpg,png格式的文件上传,绿色的英文提示意思是上传文件,它会解析python代码并返回运行结果,所以上传php木马的并不能成功在txt文档中写一段py程序来调用系统命令导入 os模块 pyhon的os模块包含了普通的系统操作功能,这里os.system('')执行了ls命令因为上传有格式的限制,所以要重命_ctf 3-11

推荐文章

热门文章

相关标签