Función de devolución de llamada --- Estuche de clasificación de matriz universal

Inserte la descripción de la imagen aquí
Tipos de datos integrados:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//自定指定排序规则
int sortWay(void* v1, void* v2)
{
    
    
	double* a = (double*)v1;
	double* b = (double*)v2;
	//如果第一个参数大于第二个参数就代表是p[maxOrMin]>p[j],升序排列
	return (*a > *b);
}
//通用数组排序
void Sort(void* arr, int size, int len, int(*sort)(void*, void*))
{
    
    
	char* p = (char*)arr;

	char* temp = (char*)malloc(size);
	for (int i = 0; i < len; i++)
	{
    
    
		int maxOrMin = i;
		char* pi = p + size * i;
		char* pMaxOrMin = p + size * i;
		for (int j = i + 1; j < len; j++)
		{
    
    
			//获取数组中每个元素的首地址
			char* pj = p + size * j;
			if (sortWay(pi, pj))
			{
    
    
				maxOrMin = j;
				pi = pj;
			}
		}
		if (maxOrMin != i)
		{
    
    
			//内存拷贝,防止直接赋值出现乱码的问题
			memcpy(temp, pMaxOrMin, size);
			memcpy(pMaxOrMin, pi, size);
			memcpy(pi, temp, size);
		}
	}
	if (temp != NULL)
	{
    
    
		free(temp);
		temp = NULL;
	}
}
void test()
{
    
    
	double arr[5] = {
    
     1.77,4.24,2.98,5.78,3.14 };
	Sort(arr, sizeof(double), 5, sortWay);
	for (int i = 0; i < 5; i++)
	{
    
    
		printf("%.2lf ", arr[i]);
	}
}
int main()
{
    
    
	test();
	return 0;
}

Inserte la descripción de la imagen aquí

Tipo de datos personalizados:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//自定义数据类型
struct person {
    
    
	char name[32];
	int age;
};
//自定指定排序规则
int sortWay(void* v1, void* v2)
{
    
    
	person* p1 = (person*)v1;
	person* p2 = (person*)v2;
	//如果第一个参数小于第二个参数就代表是降序排列
	return ((p1->age) > (p2->age));
}
//通用数组排序
void Sort(void *arr,int size,int len,int(*sort)(void *,void*))
{
    
    
	
	char* p = (char*)arr;

	char* temp = (char*)malloc(size);
	for (int i = 0; i < len; i++)
	{
    
    
		int maxOrMin = i;
		char* pi = p + size * i;
		char* pMaxOrMin = p + size * i;
		for (int j = i + 1; j < len; j++)
		{
    
    
			   //获取数组中每个元素的首地址
			char* pj = p + size * j;
			if (sortWay(pi, pj))
			{
    
    
				maxOrMin = j;
				pi = pj;
			}
		}
		if (maxOrMin != i)
		{
    
    
			 //内存拷贝,防止直接赋值出现乱码的问题
			memcpy(temp, pMaxOrMin, size);
			memcpy(pMaxOrMin, pi, size);
			memcpy(pi, temp, size);
		}
	}
	if (temp != NULL)
	{
    
    
		free(temp);
		temp = NULL;
	}
	
}
void test()
{
    
    
	person p[5] = {
    
    
		{
    
    "大忽悠",18},
		{
    
    "小朋友",17},
		{
    
    "大朋友",20},
		{
    
    "小忽悠",19},
		{
    
    "happy",100},
	};
	//按年龄降序
	Sort(p, sizeof(person), 5, sortWay);
	for (int i = 0; i < 5; i++)
	{
    
    
		printf("姓名:%s\t年龄:%d\n", p[i].name, p[i].age);
	}
}
int main()
{
    
    
	test();
	return 0;
}

Inserte la descripción de la imagen aquí
Nota:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_53157173/article/details/114149932
Recomendado
Clasificación