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.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.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
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
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 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 directa2. 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 estable4. 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
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áctica2. 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
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