Uma posição deixa de ser provisória.
Nesta implementação de Lomuto, ao fim da partição, os itens à esquerda da fronteira são menores que o pivô; os itens à direita são maiores ou iguais. O pivô fica entre essas regiões e sai das próximas chamadas.
Escolha um pivô, separe menores e maiores e resolva as partes.
Execuções concluídas nesta bancada, medidas durante o playback ativo no navegador e salvas apenas neste dispositivo.
Execute o algoritmo até o fim para transformar esta bancada em uma série de medições reais.
Separa menores e maiores ao redor de um pivô. Cada barra representa um item; a cor quente marca a comparação atual e o verde calmo indica que uma posição já não precisa ser revisitada.
Frequentemente rápido na prática; a escolha do pivô muda o comportamento.
Há comparações entre pares de itens ou varreduras repetidas. Por isso, cada aumento de entrada multiplica mais rapidamente o trabalho necessário.
Se a entrada dobra, o número de comparações pode ficar perto de quatro vezes maior.Escolha duas técnicas diferentes. As curvas usam a mesma escala visual para explicar como o custo tende a aumentar.
Use este par para observar por que O(n²) acumula trabalho mais depressa que O(n log n) quando a lista cresce. Merge Sort tende a crescer mais devagar do que Bubble Sort quando aumentam quantidade de itens (n). Isso descreve tendência assintótica, não mede o tempo do seu aparelho.
Na bancada, o último item do segmento vira o pivô. A varredura não tenta resolver a lista inteira: ela separa valores menores à esquerda e os demais à direita. Depois da troca final, o pivô ocupa uma posição que já não será revisitada.
Nesta implementação de Lomuto, ao fim da partição, os itens à esquerda da fronteira são menores que o pivô; os itens à direita são maiores ou iguais. O pivô fica entre essas regiões e sai das próximas chamadas.
boundary é a fronteira visível.Durante a varredura, tudo antes de boundary já atende à regra “menor que o pivô”. Cada item que passa no teste é trocado para essa região; os demais permanecem à direita, à espera da troca final.
As chamadas seguintes recebem segmentos estritamente menores, à esquerda e à direita da posição final do pivô. Zero ou um item já está ordenado, formando o caso-base da recursão.
Cada particionamento percorre o segmento uma vez. Quando os pivôs dividem os dados de forma razoavelmente equilibrada, o custo esperado é Θ(n log n). Se pivôs extremos se repetem, sobra um subproblema de tamanho quase n − 1 e o pior caso chega a Θ(n²).
Em uma versão mais robusta, pode-se embaralhar a entrada ou sortear o pivot, usar partição em três vias quando há muitas duplicatas, recorrer primeiro sobre o menor lado para limitar a pilha e trocar de estratégia quando a profundidade cresce demais. Essas técnicas atacam riscos distintos. Para estabilidade ou garantia de Θ(n log n), compare com Merge Sort; para biblioteca de produção, algoritmos híbridos como Introsort merecem consideração.
O destaque acompanha o mesmo passo que você vê nas barras. Execute em câmera lenta para conectar intenção e efeito.
function quickSort(items, low = 0, high = items.length - 1) { // Partition values around the last pivot if (low >= high) return items; const pivot = items[high]; let boundary = low; for (let i = low; i < high; i++) { if (items[i] < pivot) { [items[i], items[boundary]] = [items[boundary], items[i]]; boundary++; } } [items[boundary], items[high]] = [items[high], items[boundary]]; quickSort(items, low, boundary - 1); quickSort(items, boundary + 1, high); return items;}Use quando você quer bom desempenho médio em sequências na memória e não precisa preservar a ordem original de valores iguais. A melhor forma de internalizar essa escolha é comparar o mesmo cenário com outras estratégias e observar como as métricas se comportam.
testar no modo corrida