zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

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、运行结果