C语言-函数指针-快速排序算法
2023-09-11 14:19:59 时间
概述
使用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、运行结果
相关文章
- 数据结构之---C语言实现最短路径之Dijkstra(迪杰斯特拉)算法
- 【C语言天天练(十一)】深入理解指针
- NSGA,NSGA-II,Epsilon-MOEA,DE C语言Deb教授原版代码
- C语言经典算法 11-20
- C语言经典算法 1-10
- 嵌入式软件面试高频基础——C语言
- 《C语言编程初学者指南》一1.6 使用指令
- 《C语言接口与实现:创建可重用软件的技术》一2.6 扩展阅读
- 《C语言编程——零基础初学者指南(第3版)》一2.4 第二个程序示例
- 《乐在C语言》一1.4 如何编译程序
- C语言:动态内存分配(1)
- 《数据结构与算法 C语言版》—— 1.4数据类型与抽象数据类型
- 《数据结构与算法 C语言版》—— 2.1线性表的定义
- 《数据结构与算法 C语言版》—— 2.2线性表的顺序表示与实现
- 《数据结构与算法 C语言版》—— 2.5上机实验
- 《数据结构与算法 C语言版》—— 2.7习题
- 【华为OD机试 2023最新 】快递业务站(C语言题解)
- C语言经典算法五个人问岁数!——————【Badboy】
- C语言100个经典的算法
- 【源代码】将一个整数的每位数分解并按逆序放入一个数组中(用递归算法)(C语言实现)
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 1043 输出PATest (20 分)C语言
- Linux下C语言的调试--转
- C语言入门——(第一讲——一些计算机基础)
- C语言--------求第n个斐波那契数