Utilice la clasificación de burbujas para completar la función de la función de biblioteca qsort

Insertar descripción de la imagen aquí
Hola, lo que compartimos hoy es que usamos la función de burbuja para implementar qsort, que es una clasificación rápida. También hemos hablado antes sobre cómo usar la función de biblioteca qsort. Hoy intentamos usar la función de burbuja para implementarla. Por supuesto. , También hemos visto qsort y lo veremos más adelante. Continuará mejorando. Estos días soy un estudiante universitario que tiene las defensas rotas, ¡ay!
Primero echemos un vistazo a cómo es qsort. Podemos iniciar sesión en el sitio web cplusplus.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
A través de este sitio web, podemos ver cómo usar qsor. En primer lugar, podemos ver que su tipo de retorno es nulo y los parámetros son base, num, tamaño y comparación. Lo que podemos ver en inglés es que base es en realidad lo que queremos ordenar. El anterior usaba un puntero void*. Podemos pensar en void
como en realidad un bote de basura. Puede recibir cualquier cosa. Una matriz también puede ser una estructura, por lo que void* aquí indica que el tipo al que apunta este puntero puede ser int, una estructura o un tipo doble, lo que esté bien.

Entonces, primero escribamos cómo se ve una función de burbuja. Creo que aquellos que hayan leído mi artículo anterior sabrán esto: clasificación de burbujas hecha a mano.

void bubble(int* arr, int sz)
{
    
    
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
    
    
		int j = 0;
		for (j = 0; i < sz - 1 - i; j++)
		{
    
    
			if (arr[j] > arr[j + 1])
			{
    
    
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = arr[j];
			}
		}
	}
}

Veamos nuestro programa de burbujeo. El primer bucle determina el número de veces que ordenamos. Por ejemplo, si tenemos diez elementos, ¿tenemos que ordenarlos diez veces? De hecho, nueve veces es suficiente. El último ya está ordenado. , entonces no hay necesidad de ordenar, por lo que solo se necesitan nueve veces, porque suponemos que es en orden ascendente, es decir, el anterior es mayor que el siguiente, entonces en la primera pasada podemos poner el número más grande al final, por lo que debemos restar i cuando realicemos el bucle más adelante. La clasificación de burbujas debe ser muy sencilla para todos.
Entonces, ¿qué debemos hacer con el tipo de burbuja cuando simulamos la implementación de qsort? Primero, podemos usar los parámetros de qsort.

Insertar descripción de la imagen aquí
Luego podemos escribirlo así void bubble(void* base, int num, int sz, int (*cmp)(const void*, const void*)), entonces lo que debemos hacer después es en realidad lo mismo que la idea de clasificación de burbujas, la cantidad de veces en el primer ciclo, entonces lo que podemos ver es el siguiente código

void bubble(void* base, int num, int sz, int (*cmp)(const void*, const void*))
{
    
    
	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 * sz, (char*)base + (j + 1) * sz) > 0)
			{
    
    
				swap((char*)base + j * sz, (char*)base + (j + 1) * sz, sz);
			}
		}
	}
}

Los he publicado todos aquí y es más fácil de explicar. En primer lugar, usamos una función para determinar si es mayor que 0. ¿Cómo implementar la función? Los parámetros pasados ​​aquí son un lugar particularmente importante. ¿Por qué ¿dices esto? Ver Cuando lleguemos al código, primero debemos convertirlo en el tipo char*, porque esto facilitará nuestro acceso posterior. Primero podemos echar un vistazo a la función de comparación.

int cmp(const void* e1, const void* e2)
{
    
    
	return *(int*)e1 - *(int*)e2;
}

Lo que estamos comparando es un tipo entero, por lo que primero tenemos que convertirlo a un tipo entero y luego podemos comenzar a acceder a la operación de desreferencia. También usamos el tipo void para recibir punteros, por lo que también hay una ventaja aquí, que Es decir, podemos comparar cualquier tipo de datos, como el tipo doble. Lo que necesitamos cambiar es convertirlo a un tipo doble y la estructura también se puede ordenar. ¿Esto satisface nuestra clasificación rápida y puede ordenar muchos datos? ¿datos?
Luego mejoremos la función de intercambio nuevamente. Mirando el código, encontramos que los parámetros que pasamos son en realidad los mismos. ¿Por qué es esto? Porque no sabemos qué tipo de datos son. Entonces necesitamos saber este tipo de datos aquí uno por uno Tamaño, todos deben pasar un parámetro sz, luego echemos un vistazo al código de la función de intercambio

void swap(char* e1, char* e2,int sz)
{
    
    
	int i = 0;
	for (i = 0; i < sz; i++)
	{
    
    
		char tmp = *e1;
		*e1 = *e2;
		*e2 = tmp;
		e1++;
		e2++;
	}
}

Hay un malentendido aquí. También lo hice al principio. Espero que no lo hagas. Primero, pasamos el puntero y escribimos el tipo char. Lo que recibimos es un puntero como char*. Luego lo que se intercambia es no la dirección, porque el puntero es la dirección. Sabemos esto, así que aquí estamos intercambiando los caracteres señalados por el puntero. Estamos intercambiando uno por uno, por lo que necesitamos establecer un bucle externo para que todos podamos intercambiar. Esta es la razón por la que también necesitamos pasar un parámetro sz., el siguiente es el código completo

#include<stdio.h>
void print(int arr[], int sz)
{
    
    
	int i = 0;
	for (i = 0; i < sz; i++)
	{
    
    
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int cmp(const void* e1, const void* e2)
{
    
    
	return *(int*)e1 - *(int*)e2;
}
void swap(char* e1, char* e2,int sz)
{
    
    
	int i = 0;
	for (i = 0; i < sz; i++)
	{
    
    
		char tmp = *e1;
		*e1 = *e2;
		*e2 = tmp;
		e1++;
		e2++;
	}
}
void bubble(void* base, int num, int sz, int (*cmp)(const void*, const void*))
{
    
    
	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 * sz, (char*)base + (j + 1) * sz) > 0)
			{
    
    
				swap((char*)base + j * sz, (char*)base + (j + 1) * sz, sz);
			}
		}
	}
}
int main()
{
    
    
	int arr[] = {
    
     9,8,0,5,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr,sz);
	bubble(arr, sz, sizeof(arr[0]), cmp);
	print(arr,sz);
	return 0;
}

Insertar descripción de la imagen aquí
Nuestra versión burbujeante de la función qsort también se implementa con éxito aquí. No hablemos de eficiencia aquí. Lo principal es conocer esta idea. Cuando aprendamos las ocho clasificaciones principales más adelante, aprenderemos sobre la clasificación rápida. Hay tres formas de implementarlo, para que no tengamos que apresurarnos.

Hoy es el segundo artículo que escribí en la escuela. Mi computadora se averió ayer y tengo que reinstalar el sistema. Las cosas no siempre han ido bien últimamente. Cuando las cosas van mal, me siento muy triste. También espero poder ajustar mi mentalidad. en los últimos días. Gracias a todos. Lo compartiremos más tarde, ¡progresemos juntos! ! !

Supongo que te gusta

Origin blog.csdn.net/2301_76895050/article/details/132864684
Recomendado
Clasificación