Explicación detallada de la función qsort y el uso de clasificación de burbujas para simular la implementación de la función qsort

Página de inicio personal : haz clic en mí para ingresar a la página de inicio

Clasificación de columnas: lenguaje C elemental       Programación en lenguaje C——KTV        Minijuego en lenguaje C      Lenguaje C avanzado

preguntas del examen de lenguaje c

Todos son bienvenidos a dar me gusta, comentar y coleccionar.

Trabajen duro juntos e vayan juntos a una gran fábrica.

Tabla de contenido

1.función qsort

1.1 Parámetros de la función qsort

1.2 Utilice la función qsort para ordenar datos enteros

1.3 Utilice la función qsort para ordenar datos de estructura

2. Simular la implementación de la función qsort

2.1 Clasificación de burbujas

2.2 Implementación del código


         Lo que les traigo principalmente hoy es una explicación detallada de la función qsort y el uso de la clasificación de burbujas para simular la implementación de la función qsort. Aquí incluimos la comprensión de los parámetros de la función qsort y el uso de la clasificación ascendente y descendente. de estructuras de matriz para simular los parámetros de la función qsort.

1.función qsort

1.1 Parámetros de la función qsort

        Con respecto a la función qsort, creo que esta es la primera vez que la mayoría de ustedes ven esta función, primero ingresemos al sitio web cplusplus .

 Vuelva a la versión anterior y busque la función qsort

 Vemos que el archivo de encabezado de la función qsort es stdlib.h, podemos encontrar que la función qsort está definida como

void qsort (void* base, size_t num, size_t tamaño, 
            int (*compar)(const void*,const void*));

 

        Aquí base se refiere a la matriz que queremos pasar, num se refiere a la cantidad de elementos pasados ​​en la matriz, tamaño se refiere a la cantidad de bytes ocupados por un elemento de la matriz, int (*compar)(const void*, const void* ) es un puntero de función, aquí necesitamos crear una función

         El parámetro de este puntero de función es de tipo void*, porque la función qsort puede ordenar cualquier tipo de datos y puede usarse mediante conversión.

1.2 Utilice la función qsort para ordenar datos enteros

#include<stdio.h>
#include <stdlib.h>
int comper(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[5] = { 0,2,1,4,3 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), comper);
	int i;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

Podemos conseguirlo después de ejecutar.

Para orden ascendente, si queremos cambiar a orden descendente, solo necesitamos modificar nuestra función comper

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

Ordene en orden descendente después de ejecutar.

1.3 Utilice la función qsort para ordenar datos de estructura

#include<stdio.h>
#include <stdlib.h>
typedef struct student
{
	int age;
	char num[20];
}stu;
int comper(const void* e1, const void* e2)
{
	return ((stu*)e1)->age - ((stu*)e2)->age;
}
int main()
{
	stu arr[3] = { 20,"zhangsan",19,"libai",22,"aiqiyi" };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), comper);
	int i;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i].age );
	}
	return 0;
}

Al comparar nombres, necesitamos usar la función strcmp, el código específico es el siguiente

int comper(const void* e1, const void* e2)
{
	return strcmp(((stu*)e1)->num , ((stu*)e2)->num);
}

2. Simular la implementación de la función qsort

        Mencionamos anteriormente que puede usar la clasificación de burbujas para ordenar datos, pero la clasificación de burbujas tiene algunas limitaciones. Aquí usamos la clasificación de burbujas para simular la implementación de la función qsort.

2.1 Clasificación de burbujas

  Para la clasificación de burbujas, nuestro código principal es

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

Aquí nos basamos principalmente en la clasificación de burbujas para la implementación.

2.2 Implementación del código

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
int comper(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
void swap(char *p,char*q,size_t sz)
{
	int i;
	char temp;
	for (i = 0; i < sz; i++)
	{
		temp = *p;
		*p = *q;
		*q = temp;
		p++;
		q++;
	}
}
void bulubulu(void *base,size_t sz,size_t size)
{
	int i, j;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (comper((char*)base + j * size, (char*)base + (j + 1) * size)>0)
			{
				swap((char*)base+j*size,(char*)base+(j+1)*size,sz);
			}
		}
	}
}

void my_qsort(void *base,size_t num,size_t size,int(*comper)(const void *e1,const void *e2))
{
	bulubulu(base, num, size);
}
int main()
{
	int arr[5] = { 0,2,1,5,3 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, sz, sizeof(arr[0]), comper);
	int i;
	for (i = 0; i < sz; i++)
		printf("%d ", arr[i]);

}

        Aquí queremos ordenar una matriz de números enteros. Primero obtenemos cuántos elementos tiene la matriz y cuántos bytes ocupa cada elemento. Usamos void*base en nuestra función my_qsort porque no sabemos qué elementos se van a ordenar. ¿Qué tipo? ¿Lo es? Ingresamos a la función de clasificación de burbujas, que es la función bubululu. Lo más importante aquí es if (comper((char*)base + j * size, (char*)base + (j + 1) * size) > 0) y swap((char*)base+j*size,(char*)base+(j+1)*size,sz), como no sabemos qué tipo queremos ordenar, la base es void* Type , si queremos usar la función swap y la función comper, necesitamos transferir la dirección. Convertimos la base al tipo char*. También tenemos el número de bytes ocupados por el elemento, el tamaño y luego obtenemos su dirección. basado en qué elemento es En el intercambio, intercambiamos byte por byte. Aquí comper está escrito por nuestros propios usuarios, y el resto solo necesita my_qsort para resolverlo.

Ese es el final del contenido de hoy, espero que puedas aprender mucho.

Supongo que te gusta

Origin blog.csdn.net/Infernal_Puppet/article/details/132919664
Recomendado
Clasificación