
Este artigo discute várias opções para classificar trocas e também descreve um aplicativo gráfico simples ( 
processing.js ) com exemplos de classificações.
Antes de ler, recomendo que você leia os artigos do usuário 
valemak :
→ Classificação de 
trocas→ 
Classificação de bolha e Tudo-Tudo-Tudo→ 
Tipo bobo e algum outro mais inteligenteClassificação da bolha
A opção mais simples é iterar a matriz do primeiro para o último, trocando (se necessário) elementos vizinhos.
→ Confira 
aquiPara mover o controle deslizante, você precisa clicar no botão cinza no canto inferior esquerdo.
Ao clicar no botão, mova o controle deslizante um passo para a direita
slider++; 
A seguir, verificamos: chegamos ao final da matriz (depois saltamos para o início) e comparamos (trocamos) os elementos vizinhos
Como o Processing.js usa estruturas de dados Java, o código é traduzido para javascript ( 
link ); portanto, a declaração de uma matriz de instâncias da classe Module, responsável por renderizar elementos e inicializar as instâncias, acontece assim
Código Module[] mods; ... mods[0] = new Module(1*30, 30); mods[1] = new Module(2*30, 50); mods[2] = new Module(3*30, 10); mods[3] = new Module(4*30, 60); mods[4] = new Module(5*30, 20); mods[5] = new Module(6*30, 100); mods[6] = new Module(7*30, 80); mods[7] = new Module(8*30, 70); mods[8] = new Module(9*30, 90); mods[9] = new Module(10*30, 40); 
 A principal função de desenhar 
void draw () é um loop infinito no qual as instâncias de classe são classificadas
 for (Module mod : mods) { mod.display(); } 
Adicione a função 
randFoo () , que retorna valores aleatórios. Para garantir que os valores não se repitam, vamos adicioná-los a 
ArrayLis t na lista 
listRand e na função 
randFoo () , verifique se o novo número aleatório está na lista 
listRand int randFoo(){ newRand = int(random(1,11)); if(!listRand.contains(newRand) ) listRand.add(newRand ); else newRand=randFoo(); return newRand; } 
→ Confira 
aquiClassificação de pixels
A classificação de pixels (aqui) é uma implementação da classificação de bolhas.
Mudaremos os pixels mais quentes / mais claros para um lado e os mais escuros / mais frios para o outro
 void draw(){ while (i <= height) { c=get(i,j);  
→ Confira 
aquiPara começar a classificar, clique na imagem e mantenha pressionado o botão.
Você pode ler mais sobre a classificação de pixels 
aqui .
Vídeo sobre a classificação de pixels no canal oficial The Coding Train 
aquiLimitador e bandeira

Você pode reduzir o número de iterações se não iterar sobre os itens já classificados. Para fazer isso, adicione um 
limitador ao final da matriz, que mudará para o início da matriz após cada iteração
 if(slider>=limiter) { slider=1; limiter--; if(limiter<1) limiter=1; } 
→ Confira 
aquiOutra maneira de reduzir o número de bustos pode ser encontrada no artigo 
Bubble Sort (Wikipedia). Se durante a passagem da matriz nunca trocamos os elementos vizinhos, a matriz é classificada e o ciclo pode ser concluído (condição 
Iverson ).
Adicione um sinalizador de 
bandeira , que é levantado quando encontramos alguns elementos que precisam ser trocados. Se o sinalizador for levantado, itere sobre a matriz novamente. Caso contrário, termine o ciclo. O estado do sinalizador é exibido no console
Verifique os elementos vizinhos if(mods[slider].rectHight < mods[slider-1].rectHight) { flag=true;  
 → Confira 
aquiSe você colocar um limitador à esquerda e usar um elemento com um limitador como referência / mínimo, obteremos a classificação por seleção.

Adicione a variável 
min na qual o valor mínimo será carregado. Suponha que inicialmente o elemento mais à esquerda seja mínimo: durante a primeira passagem da matriz, se um elemento for menor que o mínimo, salvaremos esse elemento na variável 
min if(mods[slider-1].rectHight < min){ min=mods[slider-1].rectHight; } 
então troque o primeiro elemento e o mínimo
 if (mods[limiterL-1].rectHight>min) { vTemp= mods[limiterL-1].rectHight; mods[limiterL-1].rectHight=mods[slider-1].rectHight; mods[slider-1].rectHight=vTemp; } 
Se o controle deslizante atingir a borda direita da matriz, o limitador se moverá um passo para a direita e o controle deslizante se moverá para o limitador
 if(slider==moduleSize){ if(limiterL<moduleSize) limiterL++; min=mods[limiterL-1].rectHight; incPaddle=limiterL-1; } 
→ Confira 
aquiO número de medidas pode ser reduzido se, no início da pesquisa, compararmos (trocarmos) o elemento atual e o elemento mais à direita da matriz
 if(mods[limiterL-1].rectHight>mods[moduleSize-1].rectHight) { vTemp=mods[limiterL-1].rectHight; mods[limiterL-1].rectHight=mods[moduleSize-1].rectHight; mods[moduleSize-1].rectHight=vTemp; } 
Então você não pode verificar o elemento mais à direita da matriz
 
→ Confira 
aquiAqui você pode adicionar a classificação da parte direita da matriz em ordem decrescente, adicionando o elemento máximo 
max - obtemos a classificação do shaker por seleção. Veja a seção sobre classificação dos shakers no final do artigo.
Classificação rápida

O mecanismo de seleção de elemento de suporte também é usado na classificação rápida. Esse algoritmo envolve a seleção do elemento de referência inicial com o qual todos os outros elementos da matriz são comparados. O tempo de execução do algoritmo depende da escolha do elemento inicial. No gif acima, o elemento inicial é o número 
3 . Você pode ler mais sobre como escolher o elemento de suporte inicial no 
artigo (Wikipedia).
Um vídeo sobre classificação rápida está disponível no canal oficial do youtube dos idiomas de 
processamento e 
p5.js. Aqui você pode ver a visualização do algoritmo.
Se o primeiro elemento for básico, você poderá inserir elementos menores que o básico à sua frente, a matriz será dividida em duas partes, os elementos à esquerda serão menores que o básico, à direita - mais. Para esse método, consulte a seção sobre classificação por inserções abaixo.
Classificação dos Anões
Essencialmente, o gnomo examina os próximos e anteriores vasos de jardim: se estiverem na ordem correta, ele avança um vaso, caso contrário, ele os troca e recua um vaso.
Depois de levantar o sinalizador, salve a coordenada do controle deslizante na variável 
limitadorR e retorne o controle deslizante para o início da matriz em etapas
 slider--; 
Uma vez no início da matriz, redefina o sinalizador e coloque o controle deslizante na célula com a coordenada que salvamos na variável 
limitatorR if(slider==0){ flag=false; slider=limiterR; } 
→ Confira 
aquiAo alterar esse algoritmo, obtemos " 
classificação por inserções ".
Na classificação por inserções, o elemento de referência / mínimo é selecionado e, na parte não classificada da matriz, o elemento é selecionado, menor que a referência e inserido antes da referência

Vamos ter o mínimo de troca de elementos com os anteriores, até o de referência, e assim por diante. 
inserido na frente da referência.
Adicionar uma condição
 if(slider==limiterR-1 && mods[slider-1].rectHight<mods[limiterR-1].rectHight){ flag=false; slider=limiterR; } 
→ Confira 
aquiComparação com limitadorEssa opção de classificação pode ser arbitrariamente chamada de "classificação de inserção anã".
Coloque o limitador à esquerda e usaremos o elemento com o limitador como referência / mínimo, como na seleção de classificação.
Se o elemento atual for maior que o mínimo, mova o controle deslizante para a direita
 if(mods[slider-1].rectHight > mods[limiterL-1].rectHight) slider++; 
Se o elemento atual for menor que o mínimo, salve a coordenada do controle deslizante na variável 
limitadorR e retorne o controle deslizante para o início da matriz em etapas, como em uma classificação de gnomo
 vTemp= mods[slider-1].rectHight; mods[slider-1].rectHight=mods[slider-2].rectHight; mods[slider-2].rectHight=vTemp; slider--; 
Uma vez no início da matriz, redefina o sinalizador e coloque o controle deslizante na célula com a coordenada que salvamos na variável 
limitatorR if(flag && slider==limiterL) { flag=false; slider=limiterR; } 
Se o controle deslizante for além da borda direita, mova o limitador um passo para a direita, retorne o controle deslizante ao limitador
 if(slider==moduleSize+1) { limiterL++; slider=limiterL+1; } 
→ Confira 
aquiAqui você pode adicionar uma comparação (troca) dos elementos atuais e seguintes pelo método da bolha
 if(slider<moduleSize)if(mods[slider].rectHight<mods[slider-1].rectHight){ vTemp= mods[slider-1].rectHight; mods[slider-1].rectHight=mods[slider].rectHight; mods[slider].rectHight=vTemp; } 
→ Confira 
aqui Classificação de inserção "rápida"Nesse algoritmo, o array é dividido em duas partes pelo elemento de suporte.
Seja o primeiro elemento a referência: compare, começando pelo segundo, os elementos da matriz com a referência, se um elemento for menor que a referência
 if(mods[slider-1].rectHight < mods[pivot-1].rectHight) 
insira o elemento encontrado antes da referência
 if(mods[slider-1].rectHight < mods[pivot-1].rectHight){ flag=true;  
Se a bandeira estiver levantada, mova o controle deslizante para a esquerda em etapas até encontrarmos o elemento de suporte
 if(flag){ slider--; if(slider<pivot){ flag=false;  
T.O. a matriz é dividida em duas partes, à esquerda - os elementos são menores que a referência, à direita - mais
→ Confira 
aquiSe, após cada enumeração, as coordenadas do elemento de suporte forem salvas em 
pivotsArr array, quando o elemento de referência atinge a borda direita, obtemos um array classificado por nível / etapa. Os elementos em cada próximo nível serão maiores que os elementos no nível anterior. Os limites dos níveis serão contidos em add. 
pivotsArr array
Cada vez que você clica no botão, 
enviaremos o array 
pivotsArr para o console
 for(int i=0;i<pivotsArr.length;i++){ print(" "); print(pivotsArr[i]); print(" "); } 
Adicione a função aleatória 
randFoo () ao final do programa.
→ Confira 
aquiAgora você precisa classificar os elementos de cada nível separadamente (resta apenas adicionar a condição para finalizar o ciclo)
→ Confira 
aquiEssa classificação pode ser descrita como 
classificação por nível. 
, porque após cada enumeração, os dados numéricos são organizados em níveis, os números de cada próximo nível excedem os números do anterior.
Classificação ímpar
Vamos mover o controle deslizante em duas etapas, comparando elementos vizinhos
 slider=slider+2; 
T.O. comparamos os elementos 0 e 1, 2 e 3, 4 e 5, 6 e 7, etc.
Se o controle deslizante atingir a borda da matriz, deixe o limitador mover um passo para a esquerda e o controle deslizante para o início da matriz.
Em seguida, comparamos os elementos 1 e 2, 3 e 4, 5 e 6, 7 e 8, etc.
Tendo atingido o limitador, mudamos um passo para a direita e colocamos o controle deslizante no início da matriz.
→ Confira 
aquiClassificar escova de cabelo
Deixe o controle deslizante no início da matriz e o delimitador correto no final. Compare elementos (swap). 
Movemos o limitador um passo para a esquerda e salvamos seu índice na 
variável limiterStore if(limiter==moduleSize) { limiter = limiterStore-1; limiterStore = limiter; slider=1; } 
Mova o controle deslizante com a parada até o final da matriz em etapas
 if(limiter!=moduleSize) {  
Tendo atingido o final da matriz como um limitador, coloque o controle deslizante no início da matriz e coloque o limitador em 
limititerStore-1 if(limiter==moduleSize) { limiter = limiterStore-1; limiterStore = limiter; slider=1; } 
→ Confira 
aquiShaker sort

Adicione o limitador esquerdo 
limiterL ao início da matriz.
Deixe a bandeira 
aparecer quando o controle deslizante atingir o limitador direito 
limitatorR , então o limitador se move um passo para a esquerda. Além disso, quando a bandeira é levantada, o controle deslizante se move em etapas para o limitador esquerdo do limitador 
L - o limitador se move um passo para a direita - o controle deslizante se move em passos para a direita
→ Confira 
aquiShaker ordenar por escolhaAdicione à classificação de bolhas com o limitador direito o limitador esquerdo. A cada deslocamento do controle deslizante para a direita, verificamos (swap) o que é maior - o elemento ou limitador atual
 if(mods[slider-1].rectHight<mods[limiterL-1].rectHight){ vTemp= mods[slider-1].rectHight; mods[slider-1].rectHight=mods[limiterL-1].rectHight; mods[limiterL-1].rectHight=vTemp; } 
Quando o controle deslizante atinge o limitador direito do limitador 
R , o limitador direito move um passo para a esquerda, o limitador esquerdo move um passo para a direita e o controle deslizante retorna para o limitador esquerdo
 if(slider>=limiterR){ limiterL++; slider=limiterL; limiterR--; } 
→ Confira 
aquiPS É aqui 
que um aplicativo é descrito, o que torna o estudo de algoritmos e estruturas de dados 
muito mais interessantes .
Outra visualização de vários algoritmos e estruturas de dados.
Este artigo menciona outro 
site onde você pode ver como os dados são classificados por diferentes algoritmos.
Este artigo faz uma avaliação da complexidade da classificação de bolhas.
Mais informações sobre a avaliação da complexidade podem ser lidas 
aqui , 
aqui , 
aqui , 
aqui .