[Estructura de datos]: familia de ordenación por inserción (ordenación por inserción directa, ordenación por colinas)

Autor: Un pequeño retoño anhela convertirse en un árbol imponente
Declaración del autor: Escribe cada blog con cuidado
Autor gitee: Si
inserte la descripción de la imagen aquí
te gustan los artículos del autor, ¡presta atención al autor!


prefacio

Hoy presentaremos la clasificación por inserción. La clasificación por inserción se divide en dos tipos, una es la clasificación por inserción directa y la otra es la clasificación Hill. Estas dos clasificaciones tienen similitudes, así que vamos a presentar estas dos clasificaciones a continuación. (explicado en orden ascendente)


1. Clasificación por inserción directa

Primero, echemos un vistazo a la demostración de la animación:
inserte la descripción de la imagen aquí
estamos caminando hacia atrás paso a paso, moviéndose un poco hacia atrás cuando encontramos uno grande e insertando datos en la parte posterior del pequeño cuando sabemos que hemos encontrado uno pequeño. uno. Echemos un vistazo a la ordenación de un solo paso primero:

	int end = 9;
		int key = a[end];//先把要插入的数据保存起来,方便和其他数进行比较
		while (end >= 0)
		{
    
    
			if (key < a[end - 1])//可以小于前面的数,就把数往后面移一位
			{
    
    
				a[end] = a[end - 1];//
				  end--;
			}
			else//比前面a[end-1]的这位大就退出,把数据放到它后面,就是a[end]的位置
			{
    
    
				break;
			}
		}
		a[end] = key;//把要插入的数放到这个位置

Resultados de clasificación de un solo paso:
inserte la descripción de la imagen aquí

Veamos el dibujo:
inserte la descripción de la imagen aquí

En la ordenación real, cuando se empieza a ordenar el último dígito, el anverso debe estar en orden.Seleccionaremos la tecla de adelante hacia atrás para insertar, pero la idea de cada viaje es la misma.

Echemos un vistazo a la clasificación completa:

void insertsort(int* a, int n)
{
    
    
	for (int i = 1; i <= n-1; i++)//i从1开始就可以了,没必要从0开始
	{
    
    
		int end = i;
		int key = a[end];//先把要插入的数据保存起来,方便和其他数进行比较
		while (end > 0)//因为都是和前面的数进行,加等于就跳到前面的位置,越界了,
		{
    
    
			if (key < a[end - 1])//可以小于前面的数,就把数往后面移一位
			{
    
    
				a[end] = a[end - 1];//把前面大的数移到后一位
			   end--;
			}
			else//比前面a[end-1]的这位大就退出,把数据放到它后面,就是a[end]的位置
			{
    
    
				break;
			}
		}
		a[end] = key;//把要插入的数放到这个位置
	}
}

Después de que todos hayan dominado esta idea, comenzaremos a explicar la clasificación de Hill

2. Clasificación de colinas

La clasificación por colinas se basa en la clasificación por inserción directa, primero la agrupación, luego la clasificación previa, la adición de agrupación, la clasificación y finalmente la clasificación exitosa, echemos un vistazo a la imagen: clasificación por inserción directa de elementos agrupados, comencé con Tres son un grupo
inserte la descripción de la imagen aquí
de espacios con una distancia de dos para que todos hagan un dibujo para demostrarlo. Es más intuitivo.
inserte la descripción de la imagen aquí
Esta es la clasificación unidireccional de Hill, pero el código real va hacia atrás uno por uno. Sé que la distancia es un espacio. Que todos ver más intuitivamente, echemos un vistazo al código para esta clasificación y luego veamos el conjunto:

int gap = 2;
	for (int i = gap; i <=n - gap; i++)
	{
    
    
		int end = i;
		int key = a[end];
		while (end > 0)
		{
    
    
			if (key < a[end - gap])
			{
    
    
				a[end] = a[end - gap];
				end -= gap;
			}
			else
			{
    
    
				break;
			}
		}
		a[end] = key;
	}

Solo hicimos un pequeño cambio para la clasificación por inserción directa, cambiar el espacio a 1 es una clasificación por inserción directa.

El resultado de la clasificación de un solo paso:
inserte la descripción de la imagen aquí

Para la clasificación de Hill, quiero saltar el número más grande al final lo antes posible y el número más pequeño al frente lo antes posible, así que tengo la idea de agrupar, pero al final es necesario para volver a la clasificación por inserción directa, es decir, gap=1, entonces, ¿cómo elegimos el espacio al principio? En general, se selecciona la mitad de la cantidad de elementos de la matriz, porque la matriz está más cerca de ordenarse más tarde, y la mayoría de los datos deseados están en el rango correspondiente, por lo que el rango de la brecha debe reducirse, dividido por 2 a la vez, y dividido por cualquier número por 2, será 1 al final, echemos un vistazo a la clasificación final

Solo necesitamos asegurarnos de que el último gap=1 sea suficiente, por lo que tenemos otra forma de escribir
gap=gap/3+1;
así es como damos el valor inicial de gap

void shellsort(int* a, int n)
{
    
    
	int gap=n;
	while (gap > 0)
	{
    
    
	   gap = gap/2;
	   gap=gap/3+1;
		for (int i = gap; i <= n - gap; i++)
		{
    
    
			int end = i;
			int key = a[end];
			while (end > 0)//因为都是和前面的数进行,加等于就跳到前面的位置,越界了,
			{
    
    
				if (key < a[end - gap])
				{
    
    
					a[end] = a[end - gap];
					end -= gap;
				}
				else
				{
    
    
					break;
				}
			}
			a[end] = key;
		}
		gap/=2;
	}
}

Para la clasificación Hill, ¿por qué la eficiencia es mejor que la clasificación por inserción directa? La razón es que cuando gap> 1, todos están preclasificados y el propósito es hacer que la matriz esté más cerca del orden. Cuando gap == 1, la matriz ya está cerca del orden, por lo que será muy rápido. De esta manera, se puede lograr el efecto de optimización general.

La complejidad temporal de la clasificación Hill no es fácil de calcular, porque hay muchas formas de valorar la brecha, lo que dificulta el cálculo, por lo que la complejidad temporal de la clasificación Hill dada en muchos árboles no es fija.

Echemos un vistazo a cómo otros libros presentan la complejidad temporal de la clasificación Hill:
"Estructura de datos (edición en lenguaje C)" - Yan Weimin

inserte la descripción de la imagen aquí
"Estructura de datos - Método orientado a objetos y descripción de C++" - Yin Renkun Es
inserte la descripción de la imagen aquí
mejor que recordemos la conclusión, pero está bien si no podemos. Sí, los dibujos se pueden dominar muy rápidamente.

3. Resumen

Los dos tipos de los que hablo hoy pertenecen a la familia de tipos de inserción. Hay similitudes y diferencias entre los dos. Hay una brecha de rendimiento entre los dos. Actualizaré todos los artículos de clasificación antes de probar. Entonces, la clasificación de hoy es Detengámonos aquí primero, todos, vengan y hagan un dibujo para que lo entiendan ustedes mismos. En el próximo artículo, hablaremos sobre la selección y clasificación de la familia.
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_69369227/article/details/130020854
Recomendado
Clasificación