Estrutura de dados: algoritmo de classificação comum (4): classificação de Hill (implementação C ++)

Estrutura de dados: algoritmo de classificação comum (4) - Classificação de colina

Tipo de inserção:

1. Idéia: A cada passo, um registro a ser ordenado é inserido na posição apropriada da sequência de palavras previamente ordenada de acordo com seu tamanho de código de sequência, até que todas as inserções sejam ordenadas.
2. A questão principal: Encontre a posição de inserção apropriada na sequência classificada anteriormente.
Método: em classificação por inserção direta , classificação por inserção binária , classificação Shell

Tipo de colina

Shell inventou em 1959, o primeiro algoritmo de classificação a quebrar O (n2), que é uma versão aprimorada da classificação por inserção simples. A diferença entre ele e a classificação por inserção é que ele comparará os elementos mais distantes primeiro. A classificação em colina também é chamada de classificação incremental reduzida .

1. Ideia básica:

A classificação de Hill também é chamada de "redução da classificação de incremento". Primeiro, pegue um inteiro d1 menor que n como o primeiro incremento e divida todos os registros do arquivo em grupos d1. Todos os registros cuja distância é um múltiplo de d1 são colocados no mesmo grupo. Primeiro, execute a classificação por inserção direta em cada grupo e, a seguir, faça o segundo incremento d2. É um algoritmo aprimorado para classificação por inserção. O tamanho da etapa de classificação Hill é ajustado de grande a pequeno. Os elementos após o primeiro ciclo são comparados e trocados um a um com os elementos anteriores de acordo com a etapa de intervalo, até que o tamanho da etapa seja 1 e a seleção do tamanho da etapa seja a chave.

Calcule a descrição:

Primeiro, divida toda a sequência de registros a serem classificados em várias subseqüências para classificação por inserção direta, a descrição do algoritmo específico:

  • Escolha uma sequência incremental t1, t2, ..., tk, onde ti> tj, tk = 1;
  • Ordena a sequência k vezes de acordo com o número de sequências de incremento k;
  • Em cada passagem de classificação, de acordo com o incremento correspondente ti, a seqüência a ser classificada é dividida em várias subseqüências de comprimento m, e cada subtabela é inserida e classificada diretamente. Quando apenas o fator de incremento é 1, toda a sequência é tratada como uma tabela, e o comprimento da tabela é o comprimento de toda a sequência.

2. Exemplos

Classifique a matriz a [11] = {70,30,40,10,80,20,90,100,75,60,45} por classificação Hill

img
Fonte da imagem: 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. Resumo:

1. A complexidade de tempo da classificação incremental depende da função da sequência incremental tomada, mas até agora não há uma melhor sequência incremental. Alguém concluiu após um grande número de experimentos; quando n está em um Após o intervalo, os tempos de comparação e movimento da classificação Hill são reduzidos a n ^ 1,3. Independentemente do valor da sequência de incremento, ela deve satisfazer o último valor de incremento de 1.

2. Alguma literatura aponta que quando a sequência incremental é d [k] = 2 (t-k + 1), a complexidade de tempo da classificação de Hill é O (n 1,5), onde t é o número de passagens de classificação.

3. Em termos de complexidade do espaço, a inserção binária também é classificada no local, e a complexidade do espaço é (O (1)).

Acho que você gosta

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