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
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)).