C语言-函数指针-快速排序算法

2023-11-06

概述

        使用C语言,实现结构体多元素,排序算法(冒泡排序),这里使用示例:蓝牙信号强度排序解说

编码环境:Visual Studio 2022

1、code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;


typedef enum
{
	PUBLIC = 0x00, /**< LE Public device address type. */
	RANDOM = 0x01, /**< LE Random device address type. */
	//IDENTITY = 0x02, /**< LE Public identity address type. */
	//IDENTITY = 0x03, /**< LE Random identity address type. */
	ANONYMOUS = 0xff, /**< LE anonymous device address type. */
} T_GAP_REMOTE_ADDR_TYPE;

typedef struct
{
	char		bd_addr[18];  /**< remote BD */
	uint16_t	bd_type;     /**< remote BD type */
	char		bd_name[16]; /**< remote BD name */
	int16_t		bd_rssi;	 /**< remote BD rssi */
} T_DEV_INFO;

int compare_char(const void* o1, const void* o2)//基本数据类型排序
{
	return *(char*)o1 - *(char*)o2;//从小到大
	//return *(char*)o1 - *(char*)o2;//从大到小
	//取值//强转为相应类型的指针!!
}

int compare_int(const void* o1, const void* o2)//基本数据类型排序
{
	return *(int*)o1 - *(int*)o2;//从小到大
	//return *(int*)o1 - *(int*)o2;//从大到小
	//取值//强转为相应类型的指针!!
}

int compare_struct_rssi(const void* o1, const void* o2)
{
	return (*(T_DEV_INFO*)o1).bd_rssi - ((T_DEV_INFO*)o2)->bd_rssi;
	//注意优先级诶!//否则报错在非结构体中。。。
}

int compare_ble_dev_info(const void* o1, const void* o2)//多级排序
{
	T_DEV_INFO dev_info_o1 = *(T_DEV_INFO*)o1;
	T_DEV_INFO dev_info_o2 = *(T_DEV_INFO*)o2;

	if (dev_info_o1.bd_name == dev_info_o2.bd_name)
	{
		return dev_info_o1.bd_addr - dev_info_o2.bd_addr;
	}
	else
	{
		//return dev_info_o1.bd_rssi - dev_info_o2.bd_rssi; //按照信号弱排序
		return dev_info_o2.bd_rssi - dev_info_o1.bd_rssi;	//按照信号强排序
	}
}

void swap(char* buf1, char* buf2, int width) {
	int i = 0;
	for (i = 0; i < width; i++) {   //一次char*(走一个字节),交换一个类型的宽度
		char temp = *buf1;
		*buf1 = *buf2;
		*buf2 = temp;
		buf1++;
		buf2++;
	}
}

void my_qsort(void* base, int num, int width, int (*cmp)(const void* e1, const void* e2)) {
	int i = 0;
	for (i = 0; i < num - 1; i++) {
		int j = 0;
		for (j = 0; j < num - 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);
			}
		}
	}
}

int main(void)
{
	int i, strLen = 0, stuLen = 0;
	//*************char型*************
	char str[] = "heiha";
	strLen = sizeof(str);	//数组长度

	printf("*************char型*************\n");
	printf("Before Sorting:\n");
	for (i = 0; i < strLen; i++) {
		printf("%c ", str[i]);
	}
	printf("\n");
	//qsort(str, (strLen - 1), sizeof(str[0]), compare_char);
	my_qsort(str, (strLen - 1), sizeof(str[0]), compare_char);
	printf("After Sorting:\n");
	//元素个数//元素大小//函数指针
	for (i = 0; i < strLen; i++) {
		printf("%c ", str[i]);
	}
	printf("\n");

	printf("************struct型************\n");
	//************struct型************
	T_DEV_INFO devInfo[] =
	{
		{"E7:6A:3C:5D:E7:0B", PUBLIC,	"ZORDAI",		-100},
		{"16:3A:7D:9B:7C:AE", RANDOM,	"Hei Max",		-84},
		{"5A:77:5C:0D:94:13", PUBLIC,	"ZORDAI",		-65},
		{"7B:BD:15:08:AD:89", ANONYMOUS,"Band_E5",		-73},
		{"58:B1:1B:6C:DE:38", RANDOM,	"GS7 Max",		-95},
	};
	stuLen = sizeof(devInfo) / sizeof(devInfo[0]); //结构体大小

	printf("Before Sorting:\n");
	for (i = 0; i < stuLen; i++) {
		printf("%s %s %d %d\n", devInfo[i].bd_addr, devInfo[i].bd_name, devInfo[i].bd_type, devInfo[i].bd_rssi);
	}
	printf("\n");

	//qsort(devInfo, stuLen, sizeof(devInfo[1]), compare_ble_dev_info);
	my_qsort(devInfo, stuLen, sizeof(devInfo[1]), compare_ble_dev_info);
	printf("After Sorting:\n");
	for (i = 0; i < stuLen; i++) {
		printf("%s %s %d %d\n", devInfo[i].bd_addr, devInfo[i].bd_name, devInfo[i].bd_type, devInfo[i].bd_rssi);
	}
	printf("\n");

	return 0;
}

2、运行结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言-函数指针-快速排序算法 的相关文章

随机推荐

  • pandas基本的增删改查用法梳理

    说明 以下为之前在pandas使用过程中的所用的到对数据的基本增删改查处理方法进行梳理 文章目录 1 数据读取 resd csv 2 数据保存 3 pandas常用数据格式处理函数 4 增 5 删 6 改 元素赋值 列赋值 行赋值 7 查
  • Flink(九)CEP

    Flink 八 CEP 1 概述 2 快速入门 3 模式API 3 1 个体模式 3 2 组合模式 3 3 匹配后跳过策略 4 模式的检测处理 4 1 模式应用到数据流 4 2 处理匹配事件 4 3 处理超时事件 1 概述 所谓 CEP 其
  • 1.软件测试-Linux搭建测试环境

    1 数据库 yum y install mysql mysql server mysql devel MySQL 客户端 MySQL server 服务端 mysql devel 库 启动MySQL service mysql start
  • 无界面浏览器访问网页,python

    from selenium import webdriver from selenium webdriver chrome options import Options chrome options Options chrome optio
  • 列存储与行存储的区别

    写入 行存储的写入是一次完成 数据的完整性因此可以确定 列存储需要把一行记录拆分成单列保存 写入次数明显比行存储多 行存储在写入上占有很大的优势 数据修改 行存储是在指定位置写入一次 列存储是将磁盘定位到多个列上分别写入 行存储在数据修改也
  • 从Java到Go:实现多语言翻译服务的高性能解决方案

    本文将深入探讨如何使用Go语言 Golang 开发多语言翻译服务 我们将重点介绍从Java到Go的过渡 并提供详细的代码示例以帮助您快速上手 目录 1 为什么选择Go 2 Go语言基础 2 1 语法结构 2 2 变量 常量和类型
  • java 类增强机制

    前言 对类的增强有多少种方式 我们首先想一下一个类的生命周期 从编码到程序运行结束 对类的增强 目的是为了在使用的时候能够在类原有的行为上进行增强 所以编码一直到使用中的几乎每个环节都可以对类进行增强 主要有以下几种方式 静态代理 编译期织
  • 遇到文件误删情况,使用EasyRecovery快速恢复

    当我们不小心将文件误删了 还有办法恢复吗 可能很多朋友认为这是不可能的 一个连在电脑中都无法找到痕迹的文件 我们要怎么找到它呢 其实也不是不可能 借助专业的数据恢复软件EasyRecovery就可以帮你恢复彻底删除的文件 下面就一起来学习具
  • 【Netty】NIO基础(三大组件、文件编程)

    文章目录 三大组件 Channel Buffer Selector ByteBuffer ByteBuffer 正确使用姿势 ByteBuffer 内部结构 ByteBuffer 常见方法 分配空间 向 buffer 写入数据 从 buff
  • k-近邻算法的Python实现

    k 近邻算法的Python实现 一 概述 k 近邻算法 k Nearest Neighbour algorithm 又称为KNN算法 是数据挖掘技术中原理最简单的算法 KNN的工作原理 给定一个已知标签类别的训练数据集 输入没有标签的新数据
  • Netty网络编程框架

    一 简介 Netty是由JBOSS提供的一个java开源框架 Netty提供异步的 事件驱动的网络应用程序框架和工具 用以快速开发高性能 高可靠性的网络服务器和客户端程序 也就是说 Netty 是一个基于NIO的客户 服务器端编程框架 使用
  • B3:多个if(c++)

    做纸箱最少需要多少面积的硬纸板 题目描述 请问做一个尺寸为a b c 单位 厘米 的开口的立方体纸箱 只有一个面是不需要封的 其余5个面都需要封起来 这样算开口的 最少需要多少平方厘米的纸 6 1 6 输入 三个整数 abc 输出 制作该纸
  • Javascript中的every()与some()的区别和应用

    every 定义和用法 every 方法用于检测数组所有元素是否都符合指定条件 通过函数提供 every 方法使用指定函数检测数组中的所有元素 如果数组中检测到有一个元素不满足 则整个表达式返回 false 且剩余的元素不会再进行检测 如果
  • 遗传的效应,美貌与智慧奇妙的遗传

    身高是母亲的遗传大 在营养状况下的前提下 父母的遗传是决定孩子身高的主要因素 其中妈妈的身高尤其关键 妈妈长得高 孩子也大多长得比较高 智力是母亲的遗传大 智力有一定的遗传性 同时受到环境 营养 教育等后天因素的影响 据科学家评估 遗传对智
  • 南大通用&河北工业大学人工智能与数据科学学院党支部共建暨研究生培养基地合作签约仪式顺利举办

    2022年2月18日下午 天津南大通用数据技术股份有限公司 河北工业大学人工智能与数据科学学院党支部共建签约仪式暨研究生培养基地签约仪式在普天创新产业园23层会议室举行 南大通用董事长丁明峰 高级副总裁赵伟 总工办主任杨伟伟 人力资源部总监
  • python中有哪些去除重复项的操作

    Python中去除重复项的操作 常用的有以下几种方式 1 使用set 将列表转化为集合 再转化为列表 即可去重 list a 1 2 3 2 1 4 5 4 6 7 7 new list a list set list a print ne
  • JMeter----安装与介绍以及简单页面录制和移动端录制

    1 什么是JMeter 2 JMeter的安装 3 JMeter基本使用 4 JMeter运行原理 5 JMeter录制脚本 1 什么是JMeter JMeter简介 JMeter是Apache公司使用Java平台开发的一套测试工具 JMe
  • flowable实战(三):关于流程图编辑

    发现很多人讲到flowable 就是大概讲一下整合里面一些名词之类 实操偏少 或者用一个小demo演示一下 就完了 但是一涉及到具体的业务 你会发现涉及到工作流要有多麻烦 考虑很多情况进去会涉及到条件设置 逻辑判断甚至官方提供的那么多方法你
  • C++实现人机对战围棋(使用Leela Zero权重)-界面

    1 在 leela zero next 包中有一个 从人类游戏训练的 较弱的 网络的权重文件 https sjeng org zero best v1 txt zip 6残差块 128通道 2 并在 easyx吧 百度贴吧下了一个双人对战的
  • C语言-函数指针-快速排序算法

    概述 使用C语言 实现结构体多元素 排序算法 冒泡排序 这里使用示例 蓝牙信号强度排序解说 编码环境 Visual Studio 2022 1 code include