Estructura de datos: algoritmo de clasificación común (4): clasificación Hill (implementación de C ++)

Estructura de datos: algoritmo de clasificación común (4) - Clasificación de colinas

Tipo de inserción:

1. Idea: En cada paso, se inserta un registro para ordenar en la posición apropiada de la secuencia de palabras previamente ordenada de acuerdo con el tamaño del código de secuencia, hasta que todas las inserciones estén ordenadas.
2. La pregunta clave: busque la posición de inserción adecuada en la secuencia ordenada anteriormente.
Método: en clasificación de inserción directa , clasificación de inserción binaria , clasificación de Shell

Tipo de colina

Shell inventó en 1959, el primer algoritmo de clasificación para romper O (n2), que es una versión mejorada de la clasificación de inserción simple. La diferencia entre este y el ordenamiento por inserción es que primero comparará los elementos más lejanos. La clasificación de colinas también se denomina clasificación incremental reducida .

1. Idea básica:

La clasificación de colinas también se denomina "clasificación de incrementos reductores". Primero, tome un número entero d1 menor que n como el primer incremento y divida todos los registros del archivo en grupos d1. Todos los registros cuya distancia es múltiplo de d1 se colocan en el mismo grupo. Primero, realice la ordenación por inserción directa en cada grupo y luego tome el segundo incremento d2. Es un algoritmo mejorado para la clasificación por inserción. El tamaño del paso de clasificación Hill se ajusta de grande a pequeño. Los elementos después del primer ciclo se comparan e intercambian uno por uno con los elementos anteriores según el paso del intervalo, hasta que el tamaño del paso es 1 y la selección del tamaño del paso es la clave.

Calcule la descripción:

Primero divida la secuencia completa de registros que se clasificarán en varias subsecuencias para la clasificación por inserción directa, la descripción del algoritmo específico:

  • Elija una secuencia incremental t1, t2, ..., tk, donde ti> tj, tk = 1;
  • Ordene la secuencia k veces según el número de secuencias de incremento k;
  • En cada pasada de clasificación, según el incremento ti correspondiente, la secuencia a clasificar se divide en varias subsecuencias de longitud m, y cada subtabla se inserta y clasifica directamente. Cuando solo el factor de incremento es 1, toda la secuencia se trata como una tabla y la longitud de la tabla es la longitud de toda la secuencia.

2. Ejemplos

Ordene la matriz a [11] = {70,30,40,10,80,20,90,100,75,60,45} por clasificación Hill

img
Fuente de la imagen: https://www.cnblogs.com/zwtgyh/p/10631760.html

#include<iostream>
using namespace std;
//希尔排序算法
void shellSort(int a[], int n)  //a -- 待排序的数组, n -- 数组的长度
{
	int i, j, gap;   // gap为步长,每次减为原来的一半。
	for (gap = n / 2; gap > 0; gap /= 2)
	{
		// 共gap个组,对每一组都执行直接插入排序
		for (i = 0; i < gap; i++)
		{
			for (j = i + gap; j < n; j += gap)
			{
				// 如果a[j] < a[j-gap],则寻找a[j]位置,并将后面数据的位置都后移。
				if (a[j] < a[j - gap])
				{
					int tmp = a[j];
					int k = j - gap;
					while (k >= 0 && a[k] > tmp)
					{
						a[k + gap] = a[k];
						k -= gap;
					}
					a[k + gap] = tmp;
				}
			}
		}
	}
}
//打印数组的函数
void print(int a[], int n)
{
	for (int j = 0; j<n; j++)
	{
		cout << a[j] << "  ";
	}
	cout << endl;
}

//主函数
int main()
{
	int a[11] = { 70, 30, 40, 10, 80, 20, 90, 100, 75, 60, 45 };
	cout << "初始序列:";
	print(a, 11);
	shellSort(a, 11);
	cout << "排序结果:";
	print(a, 11);
	system("pause");
}

3. Resumen:

1. La complejidad temporal de la ordenación incremental depende de la función de la secuencia incremental tomada, pero hasta ahora no existe una secuencia incremental mejor. Alguien ha concluido después de una gran cantidad de experimentos; cuando n está en un Después del rango, los tiempos de comparación y movimiento de la clasificación Hill se reducen a n ^ 1.3. Independientemente del valor de la secuencia de incremento, debe satisfacer el último valor de incremento de 1.

2. Alguna literatura señala que cuando la secuencia incremental es d [k] = 2 (t-k + 1), la complejidad temporal de la clasificación Hill es O (n 1,5), donde t es el número de pasadas de clasificación.

3. En términos de complejidad espacial, la inserción binaria también se ordena in situ y la complejidad espacial es (O (1)).

Supongo que te gusta

Origin blog.csdn.net/qq_43801020/article/details/108108612
Recomendado
Clasificación