结合回调函数对任意类型数组排序

1. 结合回调函数和选择排序算法思想对任意类型数组排序

//参数1:数组首地址
//参数2:每个元素的长度(即每个元素所占空间大小)
//参数3:数组的元素个数
void selectSort(void *pAddr, int eleSize, int len, int(*myCompare)(void*, void*))
{
	char * temp = malloc(eleSize); //临时内存空间,大小等于数组每个元素所占空间大小
	for(int i=0;i<len;i++)
	{
		int MinOrMax = i; // 定义最小值或最大值的下标为i
		for(int j=i+1;j<len;j++)
		{
			//求出每个元素的地址
			char * pJ = (char *)pAddr + j*eleSize;
			//求出最小值或最大值的地址
			char * pMinOrMax = (char *)pAddr + MinOrMax*eleSize;
			//从小到大排序
			# 回调函数 myCompare()
			if(myCompare(pJ, pMinOrMax)) //满足一定条件,更改下标
			{
				MinOrMax = j;
			}
		}
		if(MinOrMax != i) //找到了一个更小的值
		{
			//交换下标MinOrMax 和 i 对应的元素
			char * pI = (char *)pAddr + i*eleSize; //计算i下标元素的地址
			char * pMinOrMax = (char *)pAddr + MinOrMax*eleSize; //计算真实最小值或者最大值下标的地址
			//内存交换
			memcpy(temp, pI, eleSize); //使用temp存储pI指针所指向的内存地址及数据
			memcpy(pI, pMinOrMax, eleSize); //使用pI指针所指空间存储pMinOrMax指针所指向的内存地址及数据
			memcpy(pMinOrMax, temp, eleSize); //使pMinOrMax指针所指空间存储temp指针所指向的内存地址及数据
		}
	}
	//将临时指针释放掉
	if(temp != NULL)
	{
		free(temp);
		temp = NULL;
	}
}

2. 回调函数:myCompare()

int myCompare(void * data1, void * data2)
{
	//从小到大排序
	int * num1 = data1;
	int * num2 = data2;
	return *num1 < *num2;
}

3. 自定义类型数组

struct Person
{
	char name[64];
	int age;
};

4. 回调函数 myComparePerson

int myComparePerson(void * data1, void * data2)
{
	struct Person * p1 = data1;
	struct Person * p1 = data1;
	
	//按照年龄 降序
	return (p1->age) > (p2->age);
}

void test02()
{
	struct Person person[]=
	{
		{"aaa", 10},
		{"bbb", 5},
		{"ccc", 15},
		{"ddd", 3},
	}
	int len = sizeof(persons)/sizeof(struct Person);
	//将数组中的人员 按照年龄 进行降序 从大到小
	selectSort(persons, sizeof(struct Person), len, myComparePerson);
	
	//打印数据
	for(int i=0; )
	{
		printf("姓:%s  年龄:%d\n", person[i].name, person[i].age);
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值