Uso de la función qsort C/C++

Página principal:

Todavía hay incógnitas esperando ser exploradas_Estructura de datos, proyectos pequeños, cepillado de preguntas de Luogu-CSDN Blogz

Columnas temáticas:

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

Tabla de contenido

I. Introducción        

2. Uso específico de funciones. 

1. Cómo buscar el uso de sintaxis específica de las funciones de la biblioteca 

 2.Análisis

3. Clasificación de matrices de números enteros 

4. Clasificación de matrices de punto flotante 

5.Clasificación de matrices de caracteres  

6. Clasificación de matrices de estructuras 

 3. Continuará. . .


I. Introducción        

        Cada vez que encuentra un problema que requiere clasificación, necesita escribir una función personalizada, lo que es más problemático y la complejidad del tiempo puede no ser suficiente, entonces, ¿cómo resolverlo? La función de biblioteca en lenguaje C proporciona una función qsort, que tiene menos complejidad de tiempo que la función de clasificación escrita por usted mismo . No es necesario que escriba el cuerpo de la función usted mismo para usarla. ¡Aprendamos esta función a continuación!

2. Uso específico de funciones. 

1. Cómo buscar el uso de sintaxis específica de las funciones de la biblioteca 

 Si desea conocer las funciones de la biblioteca en lenguaje C como yo, puede buscar en el sitio web oficial de CPLUSPLUS.

Sitio web: cplusplus.com

 Luego ingresará a esta interfaz y seguirá las flechas en la imagen a continuación:

En este caso, ingresará a la versión anterior del sitio web de cplusplus:

Luego busque en el cuadro de búsqueda señalado por la flecha para buscar la información de sintaxis de la función de biblioteca que desea conocer. 

 2.Análisis

De lo anterior, puede conocer alguna información de qsort :

1. El archivo de encabezado es stdlib.h

2. qsort no tiene tipo de valor de retorno.

3. qosrt tiene 4 parámetros.

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

5. 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.

6. 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.

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

Según la descripción anterior de los parámetros, el cuarto parámetro es un poco confuso, pero está bien, déjame explicarte.

El cuarto parámetro 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.

3. Clasificación de matrices de números enteros 

El último parámetro de la función qsort debe pasarse a una función ( el nombre de la función es la dirección de la función ). El tipo de parámetro de esta función es viod*. El vacío aquí no significa vacío , sino arbitrario . Sin embargo, los datos de tipo void * no se pueden desreferenciar ni someter directamente a operaciones de puntero . Deben convertirse por la fuerza al tipo de datos que necesita antes de poder realizar varias operaciones.

 return *(int*)p1 - *(int*)p2;//*(int*)p1, esto está escrito en orden ascendente. Si desea ordenar en orden descendente, simplemente intercambie p1 y p2. Simplemente use su ingenioso pequeño cerebro Puedo resolverlo.

#include<stdio.h>
#include<stdlib.h>
int cmp(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;//*(int*)p1---把p1强制转化为int*类型,然后再把强制转化的指针进行解引用
}
int main()
{
	int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr,sz,sizeof(arr[0]),cmp);
	for (int i = 0; i < sz; i++)
		printf("%d ", arr[i]);
	return 0;
}

resultado de la operación:

4. Clasificación de matrices de punto flotante 

 No hay mucha diferencia entre esto y lo anterior, solo que el tipo de matriz, el tipo de conversión forzada y el formato de carácter de salida se cambian al tipo de punto flotante, lo que no es demasiado difícil.

#include<stdio.h>
#include<stdlib.h>
int cmp(const void* p1, const void* p2)
{
	return *(float*)p1 - *(float*)p2;
}
int main()
{
	float arr[10] = { 10.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0,1.0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr,sz,sizeof(arr[0]),cmp);
	for (int i = 0; i < sz; i++)
		printf("%lf ", arr[i]);
	return 0;
}

5.Clasificación de matrices de caracteres  

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

6. Clasificación de matrices de estructuras 

Este es un poco más problemático que el anterior, pero no demasiado.

Lo único a tener en cuenta es que después de la transferencia forzada de p1, debe agregar corchetes (* (Stu*) p1) en su conjunto, así, y luego realizar la operación de señalar.

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;
}

 3. Continuará. . .

Gracias por su apoyo. Mi próximo artículo explicará cómo usar la clasificación de burbujas O (n ^ 2) para implementar la función qsort.

La función qsort de la función de biblioteca utiliza la clasificación rápida O(nlogn) .

Supongo que te gusta

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