Implementación de la función qsort C/C++ (clasificación por burbujas)

 Página principal:

Todavía hay incógnitas esperando ser exploradas_Estructura de datos, proyectos pequeños, dificultades del lenguaje C-Blog de CSDN

Columnas temáticas:

Dificultades del lenguaje C_Todavía hay blogs desconocidos esperando ser explorados-Blog CSDN

Tabla de contenido

I. Introducción

2. Explicar la implementación.

1. Ordena la matriz de números enteros 

 Implementación de clasificación

código total 

2. Cómo implementar la función cmp del parámetro en qsort

1. Tipo de punto flotante

2. Tipo de estructura 


I. Introducción

1. El primer parámetro es void*base: un puntero al primer objeto de la matriz que se va a ordenar, convertido a void*.

2. El segundo parámetro es size_t num: el número de elementos a los que apunta la base en la matriz. size_t es un tipo entero sin signo.

3. El tercer parámetro es size_t size: el tamaño de cada elemento en la matriz (en bytes), size_t es un tipo entero sin signo.

4. El cuarto parámetro es int (*compar)(const void*p1, const void*p2)): un puntero a una función que compara dos elementos.

¿Se pregunta por qué los parámetros de la función qsort en la función de la biblioteca del lenguaje C son tan problemáticos cuando escribimos ordenación por burbujas o ordenación por selección? ¿Por qué necesitamos pasar size_t size? ¿Todos ustedes tienen esas preguntas? ¡Hoy te lo explicaré detalladamente! (La función qsort en la función de biblioteca es de clasificación rápida y uso la clasificación de burbujas para implementarla) 

2. Explicar la implementación.

1. Ordena la matriz de números enteros 

 Primero, primero debemos diseñar los parámetros de la función personalizada, pero dado que estamos implementando la función qsort en la función de la biblioteca, podemos escribir los parámetros directamente en la función de la biblioteca.

Lo que queremos ordenar ahora es una matriz de números enteros, por lo que también necesitamos una matriz de números enteros.

sz se utiliza para calcular la longitud de la matriz.

Pregunta: ¿Por qué el tipo de parámetro de la matriz receptora de la función personalizada es void* en lugar de int*?

Respuesta: void* es un puntero sin tipo que puede apuntar a cualquier tipo de datos sin la necesidad de una conversión de tipo forzada. Esto significa que cuando pasa la matriz arr a void*base, puede entender el tipo void* como un tipo universal independientemente de por qué el tipo de base no es int*. (Nota: No se puede acceder directamente a las variables de tipo void* mediante desreferencia, ni se pueden realizar operaciones de puntero. Se requiere una conversión de tipo forzada para realizar las operaciones anteriores)

#include<stdio.h>
int cmp(void* x, void* y)
{
	return *(int*)x - *(int*)y;
}
//声明自定义排序函数
void qsort_m(void* base, size_t num, size_t size,int (*compar)(const void* p1, const void* p2));
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };//提供一个整型数组
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的长度
	qsort_m(arr, sz, sizeof(arr[0]), cmp);//自定义排序函数的调用
	int i = 0;
	for (i = 0; i < sz; i++)//输出
		printf("%d ", arr[i]);
	return 0;
}

 Implementación de clasificación

void qsort_m(void* base, size_t num, size_t size, int (*compar)(const void* p1, const void* p2))
{
	int i = 0, j = 0;
	for (int i = 0; i < num - 1; i++)
	{
		for (int j = 0; j < num - 1 - i; j++)
		{
			if (compar(((char*)base + j * size), (char*)base + (j + 1) * size) > 0)
			{
				//交换
				swap((char*)base + j * size, (char*)base + (j + 1) * size,size);
			}
		}
	}
}

compar (((char*)base + j * tamaño), (char*)base + (j + 1) * tamaño), esta sección necesita forzar la conversión de la base al tipo char*, el propósito es que este char * puede representar más Para los tipos de datos, la desreferenciación char* solo puede obtener un byte de datos, mientras que otros tipos como int* pueden obtener más bytes de datos después de la desreferenciación, que son más grandes que char*, por lo que usar el tipo char* puede Obtener Todos los datos pasados, así que ahora entiendes por qué necesitas pasar el tamaño del tipo de datos. j*size es para permitir que la matriz acceda a los datos en el siguiente espacio.

 Al final, queda una función de intercambio relativamente simple.

void swap(char* buf1, char* buf2, size_t size)
{
	int i = 0;
	for (int i = 0; i < size; i++)
	{
		int tmp;
		tmp = *(buf1 + i);
		*(buf1 + i) = *(buf2 + i);
		*(buf2 + i) = tmp;
	}
}

código total 

#include<stdio.h>
int cmp(void* x, void* y)
{
	return *(int*)x - *(int*)y;
}
void swap(char* buf1, char* buf2, size_t size);
void qsort_m(void* base, size_t num, size_t size, int (*compar)(const void* p1, const void* p2));
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };//提供一个整型数组
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的长度
	qsort_m(arr, sz, sizeof(arr[0]), cmp);//自定义排序函数的调用
	int i = 0;
	for (i = 0; i < sz; i++)//输出
		printf("%d ", arr[i]);
	return 0;
}
void qsort_m(void* base, size_t num, size_t size, int (*compar)(const void* p1, const void* p2))
{
	int i = 0, j = 0;
	for (int i = 0; i < num - 1; i++)
	{
		for (int j = 0; j < num - 1 - i; j++)
		{
			if (compar(((char*)base + j * size), (char*)base + (j + 1) * size) > 0)
			{
				//交换
				swap((char*)base + j * size, (char*)base + (j + 1) * size,size);
			}
		}
	}
}
void swap(char* buf1, char* buf2, size_t size)
{
	int i = 0;
	for (int i = 0; i < size; i++)
	{
		int tmp;
		tmp = *(buf1 + i);
		*(buf1 + i) = *(buf2 + i);
		*(buf2 + i) = tmp;
	}
}

2. Cómo implementar la función cmp del parámetro en qsort

        cmp es un puntero de función. Este puntero de función apunta a una función. El valor de retorno de esta función es de tipo int. Cuando el valor de retorno es <0, el elemento señalado por p1 precede al elemento señalado por p2; cuando el valor de retorno es =0, el elemento señalado por p1 es equivalente al elemento señalado por p2; cuando el valor de retorno es >0, el elemento señalado por p1 está después del elemento señalado por p2.

Si desea conocerlo en detalle, haga clic en el enlace y lea mi artículo anterior. 

Uso de la función qsort en lenguaje C_Todavía hay blogs desconocidos esperando ser explorados-Blog CSDN

1. Tipo de punto flotante

int cmp(const void* p1, const void* p2)
{
	return *(float*)p1 - *(float*)p2;
}

2. Tipo de estructura 

typedef struct Stu
{
	char name[20];
	int score;
}Stu;
int cmp(const void* p1, const void* p2)
{
	return ((Stu*)p1)->score - ((Stu*)p2)->score;
}
int main()
{
	Stu s[3] = { { "张三",50 }, { "王五",70 }, { "李四",60 } };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp);
	for (int i = 0; i < sz; i++)
		printf("%s %d\n", s[i].name,s[i].score);
	return 0;
}

Finalmente, ¡gracias por su apoyo!

Supongo que te gusta

Origin blog.csdn.net/qq_73435980/article/details/133203433
Recomendado
Clasificación