[Estructura de datos] Este artículo le brindará una comprensión integral de la clasificación (Parte 1): clasificación de inserción directa, clasificación de Hill, clasificación de selección, clasificación de montón

Tabla de contenido

1. El concepto de clasificación y su aplicación.

1.1 El concepto de clasificación

1.2 Clasificación de algoritmos comunes

En segundo lugar, la implementación de algoritmos de clasificación comunes.

2.1 Clasificación por inserción

2.1.1 Ideas

2.1.2 Clasificación por inserción directa

2.1.3 Hill sort (clasificación incremental reducida) 

2.2 Clasificación por selección

2.2.1 Idea básica

2.2.2 Clasificación de selección directa

2.2.3 Clasificación de almacenamiento dinámico 


¡Los esfuerzos sin persistencia son esencialmente sin sentido!


1. El concepto de clasificación y su aplicación.

1.1 El concepto de clasificación

Sorting : El llamado sorting es la operación de ordenar una cadena de registros en orden creciente o decreciente según el tamaño de una o algunas de las palabras clave.
Estabilidad : suponga que hay varios registros con la misma palabra clave en la secuencia de registros que se ordenarán. Si se ordenan, el orden relativo de estos registros permanece sin cambios, es decir, en la secuencia original, r[i]=r[j ] , y r[i] está antes de r[j] , y en la secuencia ordenada, r[i] todavía está antes de r[j] , se dice que el algoritmo de clasificación es estable; de ​​lo contrario, se llama inestable.

 Estable: clasificación por inserción directa, clasificación por burbuja, clasificación por fusión

Inestable: clasificación por colinas, clasificación por selección, clasificación por montón, clasificación rápida

Clasificación interna : una clasificación en la que todos los elementos de datos se colocan en la memoria.
Clasificación externa : no se pueden colocar demasiados elementos de datos en la memoria al mismo tiempo, y la clasificación de datos no se puede mover entre la memoria interna y la externa de acuerdo con los requisitos del proceso de clasificación.

1G = 1024 MB 1024 MB = 1024 * 1024 KB 1024 * 1024 KB = 1024 * 1024 * 1024 bytes (mil millones)

(1) La clasificación por inserción directa, la clasificación por colinas, la clasificación por selección directa, la clasificación por cubos, la clasificación por burbujas, la clasificación rápida y la clasificación por fusión son clasificaciones internas. La ordenación por combinación se puede ordenar externamente 

(2) Clasificación interna: los datos están en la memoria, son rápidos y se puede acceder a los subíndices aleatoriamente (porque es una matriz); clasificación externa: los datos están en el disco, son lentos, tienen acceso en serie (archivo) y hay una gran cantidad de datos

 Dado un archivo con 1000 millones (memoria 4G) de enteros, pero solo 1G de memoria en ejecución, ¿ordenar los 1000 millones de datos en el archivo?   

Idea : la cantidad de datos no se puede cargar en la memoria, así que encuentre una manera de controlar la fusión de dos archivos ordenados en un archivo ordenado más grande

Idea : primero divida en 4 partes iguales, lea la clasificación de la memoria (aquí no se puede usar la clasificación combinada porque se necesita espacio adicional), después de clasificar, vuelva a escribir en el archivo de disco pequeño y luego combínelo en el disco

1.2 Clasificación de algoritmos comunes

 Bubble Sort<Direct Insertion Sort<Heap Sort<Hill Sort<[Cuanto más grande, mejor]

En segundo lugar, la implementación de algoritmos de clasificación comunes.

2.1 Clasificación por inserción

2.1.1 Ideas

La ordenación por inserción es un método simple de ordenación por inserción.

La idea básica del ordenamiento por inserción: hay un intervalo ordenado, inserta un dato y mantenlo en orden. 【Comparando los datos insertados y los datos de intervalo de atrás hacia adelante, si está delante de los datos de intervalo, mueva los datos de intervalo hacia atrás un bit, si está detrás de los datos, insértelo directamente en esa posición. De esta manera no hay problema de sobrescribir datos.

2.1.2 Clasificación por inserción directa

Sin embargo, cómo ordenar un rango desordenado. [Los primeros datos se pueden considerar como un intervalo ordenado, y los segundos datos detrás se insertan en los primeros datos. Cuando se mueven los datos, habrá un problema de sobrescritura de datos, que se puede guardar usando una variable temporal. En esta vez, Dos datos se llaman un intervalo válido, y el tercer dato después de eso se inserta, y así sucesivamente.

//插入排序//升序
void InsertSort(int* a, int n)
{
	int i = 0;
	for (i = 0; i < n - 1; i++)
	{
		int end = i;//即将插入区间的最后一个元素下标
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (tmp > a[end])
			{
				//如果把a[end + 1] = tmp;写到这里,会遗漏一种情况,tmp的值是最小的,end=-1,不能进入循环,tmp的值没有赋值给a[0]
				break;//插入完成,跳出循环
			}
			else
			{
				a[end + 1] = a[end];
				end--;
			}
		}
		//还有一种情况,当tmp的值是最小的,此时tmp的值是-1,还没有赋值给a[0],就不能进入循环了
		a[end + 1] = tmp;
	}
}

 El n-1 de la primera capa de loop se refiere al subíndice del último elemento

La complejidad del tiempo es O(N^2), la complejidad del espacio es O(1);

1. Cuanto más cerca esté el conjunto de elementos del orden, mayor será la eficiencia de tiempo del algoritmo de clasificación de inserción directa
2. Complejidad del tiempo: O(N^2) [El peor resultado es el orden inverso O(N^2), y el buen resultado es ordenado o cercano al orden O(N)]
3. Complejidad del espacio: O(1) , es un algoritmo de clasificación estable
4. Estabilidad: estable

2.1.3 Hill sort (clasificación incremental reducida) 

(1) La clasificación por colinas se divide en dos partes: la primera parte es: preclasificación [hacer que se acerque al orden, porque cuando la clasificación por inserción directa se aproxima al orden, la complejidad del tiempo es O(N)] La segunda parte es: clasificación por inserción directa

 Código:

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = (gap / 3) + 1;
		for (int j = 0; j < n - gap; j++)
		{
			int end = j;
			int tmp = a[j + gap];
			while (end >= 0)
			{
				if (a[end] < tmp)
				{
					break;
				}
				else
				{
					a[end + gap] = a[end];
					end -= gap;
				}
			}
			a[end + gap] = tmp;
		}
	}
	
}

El n-gap del bucle de la segunda capa también es el subíndice del último elemento, pero hay un total de grupos de gap, por lo que es n-gap

Clasificación previa : los datos más grandes llegan más rápido a la parte posterior y los datos más pequeños al frente más rápido, lo que hace que estén cerca del orden

Primer grupo , tome gap = 3, luego tome el primer elemento, el cuarto elemento, el séptimo elemento... (hasta que el subíndice de este elemento sea mayor que el último subíndice de la matriz) en un grupo; tome los segundos Elementos, el quinto elemento... Dividido en un grupo; Tome el tercer elemento, el sexto elemento... Dividido en un grupo; [Cuántos huecos se dividen en grupos] Después de agrupar, ordene, respectivamente Ordene el conjunto de datos de hueco usando directo tipo de inserción

Si la brecha es más pequeña , está más cerca del orden; si la brecha es más grande , los datos grandes pueden ir al final más rápido y los datos pequeños pueden ir al frente más rápido, pero están menos cerca del orden.

Complejidad del tiempo : O(N*log es el logaritmo de N con base 3), el promedio es O(N^1.3)

Mire la parte de clasificación previa, si la brecha es muy grande, entonces se puede ignorar el bucle más interno, es O (N),

Si la brecha es pequeña y los datos ya están muy cerca del orden, entonces también es O(N).

Mira el ciclo más externo, N/3/3/3/3/3.../3=1, es decir, la potencia x de 3 es igual a N, es decir, log es el logaritmo de N con base 3

Estabilidad : Inestable

2.2 Clasificación por selección

2.2.1 Idea básica

  Seleccione el elemento más pequeño (o más grande) de los elementos de datos que se ordenarán cada vez y guárdelo al comienzo de la secuencia hasta que se agoten todos los elementos de datos que se ordenarán.

2.2.2 Clasificación de selección directa

Atraviese para encontrar la posición del número más grande y más pequeño, colóquelos en ambos extremos de la matriz [Nota: esto es para intercambiar elementos, de lo contrario, los datos se sobrescribirán], luego atraviese para encontrar el segundo número más pequeño y el segundo más grande, y colóquelos en el segundo encabezado de la matriz Posición... hasta que todos los elementos de datos estén alineados.

Visualización de código : [Optimizado] Lo que no está optimizado es encontrar un elemento a la vez

void SelectSort(int* a, int n)
{
	int left = 0;
	int right = n - 1;
	while (left < right)
	{
		int mini = left;
		int maxi = left;
		for (int i = left + 1; i <= right; i++)
		{
			if (a[mini] > a[i])
			{
				mini = i;
			}
			if (a[maxi] < a[i])
			{
				maxi = i;
			}
		}
		Swap(&a[mini], &a[left]);//如果left_0是最大值,最大值此时换到mini_5的位置,/maxi最大位置本来是0,但是此时最大值被换到5的位置,那么此时最小值会被换到最后
		if (left == maxi)
		{
			maxi = mini;
		}
		Swap(&a[maxi], &a[right]);
		right--;
		left++;
	}
}

Nota: (cuando el valor mínimo se intercambia por primera vez) si left_0 es el valor máximo, el valor máximo se cambia a la posición de mini_5 en este momento, y la posición máxima de /maxi es originalmente 0, pero en este momento el valor máximo se cambia a la posición de 5. Luego, el valor mínimo se reemplazará al final en este momento

1. El pensamiento de selección y clasificación directa es muy fácil de entender, pero la eficiencia no es muy buena. rara vez se usa en la práctica
2. Complejidad del tiempo: O(N^2)
En el mejor y el peor de los casos, la complejidad del tiempo es O(N), porque es necesario atravesar para encontrar los subíndices de elementos más grandes y más pequeños, independientemente del orden o el desorden.
3. Complejidad del espacio: O(1)
4. Estabilidad: Inestable

La clasificación por selección directa es mejor que la clasificación por burbujas, pero cuando los datos están ordenados o casi ordenados, la clasificación por burbujas es mejor que la clasificación por selección directa.

2.2.3 Clasificación de almacenamiento dinámico

Para obtener más información, consulte: Vínculo de clasificación de almacenamiento dinámico 

Heapsort (Heapsort) se refiere a un algoritmo de clasificación diseñado utilizando una estructura de datos de árbol apilado (montón), que es un tipo de clasificación por selección. Selecciona datos a través del montón. Cabe señalar que debe crear un montón grande para el orden ascendente y un montón pequeño para el orden descendente.
1. La clasificación de montón usa el montón para seleccionar números, lo cual es mucho más eficiente.
2. Complejidad del tiempo: O(N*logN)
3. Complejidad del espacio: O(1)
4. Estabilidad: Inestable

Supongo que te gusta

Origin blog.csdn.net/m0_57388581/article/details/131734305
Recomendado
Clasificación