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](/images/kompyuteri/metodi-sortirovki-v-programmirovanii-sortirovka-puzirkom.jpg)
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](/images/kompyuteri/metodi-sortirovki-v-programmirovanii-sortirovka-puzirkom_2.jpg)
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](/images/kompyuteri/metodi-sortirovki-v-programmirovanii-sortirovka-puzirkom_3.jpg)
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](/images/kompyuteri/metodi-sortirovki-v-programmirovanii-sortirovka-puzirkom_4.jpg)
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;
}