/ / Métodos de classificação na programação: classificação por bolhas

Métodos de classificação na programação: classificação de bolhas

A classificação por bolha não é apenas considerada a maismétodo rápido, além disso, fecha a lista dos métodos de ordenação mais lentos. No entanto, também tem suas vantagens. Portanto, a classificação pelo método de bolha é a solução mais lógica e natural para o problema, se você precisar organizar os elementos em uma determinada ordem. Uma pessoa comum, por exemplo, o usará manualmente - apenas por intuição.

De onde veio esse nome incomum?

Tipo de bolha

O nome do método foi inventado usando uma analogia combolhas de ar na água. Esta é uma metáfora. Assim como pequenas bolhas de ar sobem - afinal, sua densidade é maior do que qualquer líquido (neste caso, água), então cada elemento da matriz, quanto menor for em valor, mais gradualmente fará seu caminho até o início da lista de números.

Descrição do Algoritmo

A classificação por bolha é feita da seguinte maneira:

  • primeira passagem: os elementos da matriz de números são tomados por dois e também são comparados aos pares. Se em alguns dois elementos o primeiro valor for maior que o segundo, o programa troca suas posições;
  • portanto, o maior número termina no final da matriz. Enquanto todos os outros elementos permanecem, como estavam, em uma ordem caótica e ainda requerem classificação;
  • portanto, a segunda passagem é necessária: ela é feita por analogia com a anterior (já descrita) e tem o número de comparações - menos um;
  • a passagem número três tem uma comparação a menos que a segunda e duas a menos que a primeira. Etc;
  • para resumir, cada passagem tem (valores totais na matriz, um número específico) menos (número da passagem) comparações.

Tipo de bolha

Ainda mais curto, o algoritmo do futuro programa pode ser escrito da seguinte forma:

  • uma matriz de números é verificada até que quaisquer dois números sejam encontrados, e o segundo deles deve ser maior que o primeiro;
  • o programa troca os elementos da matriz localizados incorretamente em relação uns aos outros.

Pseudocódigo com base no algoritmo descrito

A implementação mais simples é a seguinte:

Procedimento Sortirovka_Puzirkom;

O começo

ciclo para j a partir de nachalnii_index antes konechii_index;

ciclo para e a partir de nachalnii_index antes konechii_index-1;

se um massiv [i]> massiv [i + 1] (o primeiro elemento é maior que o segundo), então:

(mude os valores nos lugares);

o fim

Claro, aqui a simplicidade apenas exacerbasituação: quanto mais simples o algoritmo, mais todas as deficiências aparecem nele. O custo do tempo é muito alto, mesmo para uma pequena matriz (aqui a relatividade entra em jogo: para um leigo, a quantidade de tempo pode parecer pequena, mas no negócio de um programador, cada segundo ou mesmo um milissegundo conta).

Era necessária uma melhor implementação. Por exemplo, levando em consideração a troca de valores na matriz por lugares:

Procedimento Sortirovka_Puzirkom;

O começo

sortirovka = verdadeiro;

tchau sortirovka = verdadeiro;

sortirovka = falso;

ciclo para e a partir de nachalnii_index antes konechii_index-1;

se um massiv [i]> massiv [i + 1] (o primeiro elemento é maior que o segundo), então:

(trocamos os elementos em lugares);

sortirovka = verdadeiro; (indicou que a troca foi feita).

O fim.

Desvantagens do método

A principal desvantagem é a duração do processo. Quanto tempo leva o algoritmo de classificação de bolhas?

O tempo de execução é calculado a partir do quadrado do número de números na matriz - o resultado final é proporcional a ele.

No pior caso, a matriz será percorridatantas vezes quanto houver elementos menos um valor. Isso ocorre porque, no final, resta apenas um elemento sem nada para comparar, e a última passagem pelo array torna-se uma ação inútil.

Além disso, o método de classificação portrocas, como também é chamado, apenas para pequenas matrizes. Não será possível processar grandes quantidades de dados com sua ajuda: o resultado serão erros ou uma falha do programa.

tipo de bolha pascal

Vantagens

O tipo de bolha é muito fácil de entender.Nos currículos das universidades técnicas, ao estudar a ordenação dos elementos do array, é o primeiro passo. O método é facilmente implementado na linguagem de programação Delphi (D (Delphi) e C / C ++ (C / C plus plus), um algoritmo incrivelmente simples para organizar valores na ordem correta, e em Pascal. é ideal para iniciantes.

Devido a deficiências, o algoritmo não é usado para fins extracurriculares.

Princípio de classificação claro

Vista inicial da matriz 8 22 4 74 44 37 1 7

Passo 1 8 22 4 74 44 37 1 7

8 22 4 74 44 1 37 7

8 22 4 74 1 44 37 7

8 22 4 1 74 44 37 7

8 22 1 4 74 44 37 7

8 1 22 4 74 44 37 7

1 8 22 4 74 44 37 7

Passo 2 1 8 22 4 74 44 7 37

1 8 22 4 74 7 44 37

1 8 22 4 7 74 44 37

1 8 22 4 7 74 44 37

1 8 4 22 7 74 44 37

1 4 8 22 7 74 44 37

Passo 3 1 4 8 22 7 74 37 44

1 4 8 22 7 37 74 44

1 4 8 22 7 37 74 44

1 4 8 7 22 37 74 44

1 4 7 8 22 37 74 44

Passo 4 1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

Passo 5 1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

Passo 6 1 4 7 8 22 37 44 74

1 4 7 8 22 37 44 74

Passo 7 1 4 7 8 22 37 44 74

Exemplo de classificação por bolha em Pascal

algoritmo de classificação de bolha

Exemplo:

const kol_mas = 10;

var massiv: array [1..kol_mas] de inteiro;

a, b, k: inteiro;

começar

writeln ("entrada", kol_mas, "elementos da matriz");

para a: = 1 para kol_mas do readln (massiv [a]);

para a: = 1 a kol_mas-1 comece

para b: = a + 1 para kol_mas começar

se massiv [a]> massiv [b] então comece

k: = massiv [a]; massiv [a]: = massiv [b]; massiv [b]: = k;

fim;

fim;

fim;

writeln ("após classificação");

para a: = 1 para kol_mas do writeln (massiv [a]);

fim.

Um exemplo de classificação por bolha em C (C)

Exemplo:

#incluir

#incluir

int main (int argc, char * argv [])

{

int massiv [8] = {36, 697, 73, 82, 68, 12, 183, 88}, i, ff;

para (;;) {

ff = 0;

para (i = 7; i> 0; i -) {

if (massiv [i] <massiv [i-1]) {

troca (massiv [i], massiv [i-1]);

ff ++;

}

}

if (ff == 0) quebra;

}

getch (); // atraso da tela

return 0;

}