<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bernardo Lebron</title>
    <description>The latest articles on DEV Community by Bernardo Lebron (@bernardo_lebron).</description>
    <link>https://dev.to/bernardo_lebron</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3806545%2F913f23cf-68b9-4ced-87f1-85be0c53eaa7.png</url>
      <title>DEV Community: Bernardo Lebron</title>
      <link>https://dev.to/bernardo_lebron</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bernardo_lebron"/>
    <language>en</language>
    <item>
      <title>Sorting Wars: Benchmarking Selection, Insertion, Gnome e Bubble Sort em 5 Linguagens</title>
      <dc:creator>Bernardo Lebron</dc:creator>
      <pubDate>Sat, 16 May 2026 04:44:08 +0000</pubDate>
      <link>https://dev.to/bernardo_lebron/sorting-wars-benchmarking-selection-insertion-gnome-e-bubble-sort-em-5-linguagens-3g4g</link>
      <guid>https://dev.to/bernardo_lebron/sorting-wars-benchmarking-selection-insertion-gnome-e-bubble-sort-em-5-linguagens-3g4g</guid>
      <description>&lt;p&gt;Algoritmos quadráticos são lentos — isso todo mundo sabe. Mas &lt;em&gt;o quão&lt;/em&gt; lentos? E a linguagem escolhida importa mais do que o algoritmo em si? Foi exatamente isso que nossa turma de Algoritmos e Estruturas de Dados I do &lt;strong&gt;CEFET-MG&lt;/strong&gt; decidiu testar empiricamente.&lt;/p&gt;

&lt;p&gt;Implementamos &lt;strong&gt;Selection Sort, Insertion Sort, Gnome Sort e Bubble Sort&lt;/strong&gt; em &lt;strong&gt;C, C++, Rust, JavaScript e Python&lt;/strong&gt;, rodamos benchmarks com até 1 milhão de elementos e coletamos os dados. Esse post resume o que encontramos — incluindo alguns resultados que nos surpreenderam bastante.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 Por que estudar algoritmos O(n²) em 2025?
&lt;/h2&gt;

&lt;p&gt;Antes de mergulhar nos números, vale responder a pergunta óbvia. Três razões principais:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Didática&lt;/strong&gt; — a lógica é direta, ideal para aprender análise de complexidade e invariantes de laço.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entradas pequenas&lt;/strong&gt; — para &lt;code&gt;N ≤ ~50&lt;/code&gt;, o overhead reduzido pode torná-los mais rápidos que algoritmos sofisticados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptatividade&lt;/strong&gt; — Insertion Sort e Bubble Sort com parada antecipada chegam a &lt;strong&gt;O(n)&lt;/strong&gt; em entradas quase ordenadas. É por isso que o &lt;strong&gt;TimSort&lt;/strong&gt; (usado em Python e Java) usa Insertion Sort internamente para subconjuntos pequenos.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📐 Os Algoritmos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Selection Sort — O inflexível
&lt;/h3&gt;

&lt;p&gt;Seleciona o mínimo do subarray não ordenado e o move para a posição correta com uma única troca.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PARA i DE 0 ATE N - 2 FACA
  MIN_IDX &amp;lt;- i
  PARA j DE i + 1 ATE N - 1 FACA
    SE VETOR[j] &amp;lt; VETOR[MIN_IDX] ENTAO
      MIN_IDX &amp;lt;- j
  SE MIN_IDX != i ENTAO
    TROCA VETOR[i] COM VETOR[MIN_IDX]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Característica marcante:&lt;/strong&gt; sempre realiza exatamente &lt;code&gt;n(n-1)/2&lt;/code&gt; comparações, independente da entrada. Não existe melhor caso em comparações — é &lt;strong&gt;Θ(n²) em todos os cenários&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Caso&lt;/th&gt;
&lt;th&gt;Comparações&lt;/th&gt;
&lt;th&gt;Complexidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Melhor (ordenado)&lt;/td&gt;
&lt;td&gt;n(n−1)/2&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Médio (aleatório)&lt;/td&gt;
&lt;td&gt;n(n−1)/2&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pior (invertido)&lt;/td&gt;
&lt;td&gt;n(n−1)/2&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ In-place · ❌ Não estável · ❌ Não adaptativo&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Insertion Sort — O adaptativo
&lt;/h3&gt;

&lt;p&gt;Mantém um subarray ordenado à esquerda e insere cada novo elemento na posição correta via &lt;strong&gt;shifting&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PARA i DE 1 ATE N - 1 FACA
  CHAVE &amp;lt;- VETOR[i]
  j &amp;lt;- i - 1
  ENQUANTO j &amp;gt;= 0 E VETOR[j] &amp;gt; CHAVE FACA
    VETOR[j + 1] &amp;lt;- VETOR[j]
    j &amp;lt;- j - 1
  VETOR[j + 1] &amp;lt;- CHAVE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Em entradas já ordenadas, o laço interno nunca executa: complexidade &lt;strong&gt;O(n)&lt;/strong&gt; no melhor caso. Isso ficou claro nos nossos dados — até 10⁶ elementos, o cenário crescente terminou em microssegundos.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Caso&lt;/th&gt;
&lt;th&gt;Comparações&lt;/th&gt;
&lt;th&gt;Complexidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Melhor (ordenado)&lt;/td&gt;
&lt;td&gt;n − 1&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Médio (aleatório)&lt;/td&gt;
&lt;td&gt;n(n−1)/4&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pior (invertido)&lt;/td&gt;
&lt;td&gt;n(n−1)/2&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ In-place · ✅ Estável · ✅ Adaptativo&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Gnome Sort — O excêntrico
&lt;/h3&gt;

&lt;p&gt;Opera como um "gnomo organizando vasos": avança comparando adjacentes, e ao encontrar desordem, troca e recua uma posição.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INDICE &amp;lt;- 0
ENQUANTO INDICE &amp;lt; N FACA
  SE INDICE = 0 OU VETOR[INDICE] &amp;gt;= VETOR[INDICE - 1] ENTAO
    INDICE &amp;lt;- INDICE + 1
  SENAO
    TROCA VETOR[INDICE] COM VETOR[INDICE - 1]
    INDICE &amp;lt;- INDICE - 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Funcionalmente equivalente a um Insertion Sort por trocas — mas com movimento local em vez de shifting. Também adaptativo: O(n) no melhor caso.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Caso&lt;/th&gt;
&lt;th&gt;Comparações&lt;/th&gt;
&lt;th&gt;Complexidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Melhor (ordenado)&lt;/td&gt;
&lt;td&gt;n − 1&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Médio (aleatório)&lt;/td&gt;
&lt;td&gt;(A DEPENDER)&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pior (invertido)&lt;/td&gt;
&lt;td&gt;n(n−1)/2&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ In-place · ✅ Estável · ✅ Adaptativo&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Bubble Sort — O clássico (com parada antecipada)
&lt;/h3&gt;

&lt;p&gt;Realiza passagens comparando pares adjacentes. A variável &lt;code&gt;swapped&lt;/code&gt; permite encerramento antecipado quando o vetor já está ordenado.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PARA i DE 0 ATE N - 1 FACA
  SWAPPED &amp;lt;- FALSO
  PARA j DE 0 ATE N - i - 2 FACA
    SE VETOR[j] &amp;gt; VETOR[j + 1] ENTAO
      TROCA VETOR[j] COM VETOR[j+1]
      SWAPPED &amp;lt;- VERDADEIRO
  SE SWAPPED = FALSO ENTAO
    RETORNE  // Encerramento antecipado
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Caso&lt;/th&gt;
&lt;th&gt;Comparações&lt;/th&gt;
&lt;th&gt;Complexidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Melhor (ordenado)&lt;/td&gt;
&lt;td&gt;n − 1&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Médio (aleatório)&lt;/td&gt;
&lt;td&gt;n(n−1)/4&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pior (invertido)&lt;/td&gt;
&lt;td&gt;n(n−1)/2&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ In-place · ✅ Estável · ✅ Adaptativo (com parada antecipada)&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🧪 Metodologia
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tamanhos de entrada:&lt;/strong&gt; N ∈ { 10², 10³, 10⁴, 10⁵, 10⁶ }&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cenários:&lt;/strong&gt; crescente (melhor caso), aleatório (caso médio), decrescente (pior caso)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repetições:&lt;/strong&gt; 5 execuções; média das 3 centrais (descartando menor e maior)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Otimizações testadas:&lt;/strong&gt; &lt;code&gt;-O0&lt;/code&gt; e &lt;code&gt;-O3&lt;/code&gt; para C/C++/Rust&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medição:&lt;/strong&gt; apenas tempo de ordenação (I/O descartado)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada linguagem usou sua estrutura de dados nativa:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Linguagem&lt;/th&gt;
&lt;th&gt;Estrutura&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;double[]&lt;/code&gt; com &lt;code&gt;malloc&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;double&lt;/code&gt; 64-bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;&lt;code&gt;std::vector&amp;lt;double&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;double&lt;/code&gt; 64-bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Vec&amp;lt;f64&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;f64&lt;/code&gt; 64-bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Array&lt;/code&gt; (V8 float64)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Number&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;list&lt;/code&gt; (refs a PyObject)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  📊 Resultados — Selection Sort
&lt;/h2&gt;

&lt;p&gt;O Selection Sort foi o mais previsível: tempos quase idênticos nos três cenários, confirmando a não-adaptatividade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;N = 10⁵ — tempo em segundos (-O3 / otimização máxima)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Linguagem&lt;/th&gt;
&lt;th&gt;Crescente (s)&lt;/th&gt;
&lt;th&gt;Aleatório (s)&lt;/th&gt;
&lt;th&gt;Decrescente (s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C (-O3)&lt;/td&gt;
&lt;td&gt;2.0500&lt;/td&gt;
&lt;td&gt;3.5188&lt;/td&gt;
&lt;td&gt;1.9618&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++ (-O3)&lt;/td&gt;
&lt;td&gt;2.1247&lt;/td&gt;
&lt;td&gt;3.5188&lt;/td&gt;
&lt;td&gt;1.9089&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust (-O3)&lt;/td&gt;
&lt;td&gt;2.3265&lt;/td&gt;
&lt;td&gt;4.2560&lt;/td&gt;
&lt;td&gt;2.1320&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript (V8)&lt;/td&gt;
&lt;td&gt;3.5835&lt;/td&gt;
&lt;td&gt;6.6564&lt;/td&gt;
&lt;td&gt;3.5851&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;93.164&lt;/td&gt;
&lt;td&gt;164.890&lt;/td&gt;
&lt;td&gt;98.378&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Python para N = 10⁶ foi descartado — tempo estimado superior a &lt;strong&gt;10 horas&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Hierarquia:&lt;/strong&gt; &lt;code&gt;C -O3 ≈ C++ -O3 &amp;lt; Rust &amp;lt; JavaScript ≪ Python&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  📊 Resultados — Insertion Sort
&lt;/h2&gt;

&lt;p&gt;Aqui a adaptatividade brilhou. No cenário crescente com N = 10⁶, todas as linguagens terminaram em &lt;strong&gt;menos de 12 ms&lt;/strong&gt;. Já no cenário decrescente, o pior caso quadrático foi brutal:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;N = 10⁵ — tempo em segundos (-O3 / otimização máxima)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Linguagem&lt;/th&gt;
&lt;th&gt;Crescente (s)&lt;/th&gt;
&lt;th&gt;Aleatório (s)&lt;/th&gt;
&lt;th&gt;Decrescente (s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C (-O3)&lt;/td&gt;
&lt;td&gt;0.000055&lt;/td&gt;
&lt;td&gt;0.615683&lt;/td&gt;
&lt;td&gt;1.188966&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++ (-O3)&lt;/td&gt;
&lt;td&gt;0.0000634&lt;/td&gt;
&lt;td&gt;0.587483&lt;/td&gt;
&lt;td&gt;1.183000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust (-O3)&lt;/td&gt;
&lt;td&gt;0.000079&lt;/td&gt;
&lt;td&gt;0.897895&lt;/td&gt;
&lt;td&gt;1.774292&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript (V8)&lt;/td&gt;
&lt;td&gt;0.000809&lt;/td&gt;
&lt;td&gt;1.525250&lt;/td&gt;
&lt;td&gt;3.033301&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;0.005321&lt;/td&gt;
&lt;td&gt;136.295&lt;/td&gt;
&lt;td&gt;226.560&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Para N = 10⁶ no pior caso sem otimização, C++ chegou a &lt;strong&gt;3670 s&lt;/strong&gt; (~1 hora). Com &lt;code&gt;-O3&lt;/code&gt;, caiu para &lt;strong&gt;119 s&lt;/strong&gt; — speedup de &lt;strong&gt;~30×&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  📊 Resultados — Gnome Sort
&lt;/h2&gt;

&lt;p&gt;O Gnome Sort trouxe a maior surpresa da série: &lt;strong&gt;Rust superou C e C++ no caso médio&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;N = 10⁵ — tempo em segundos (-O3 / otimização máxima)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Linguagem&lt;/th&gt;
&lt;th&gt;Crescente (s)&lt;/th&gt;
&lt;th&gt;Aleatório (s)&lt;/th&gt;
&lt;th&gt;Decrescente (s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C (-O3)&lt;/td&gt;
&lt;td&gt;0.000179&lt;/td&gt;
&lt;td&gt;15.19068&lt;/td&gt;
&lt;td&gt;28.90668&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++ (-O3)&lt;/td&gt;
&lt;td&gt;0.000159&lt;/td&gt;
&lt;td&gt;13.96807&lt;/td&gt;
&lt;td&gt;28.25787&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust (-O3)&lt;/td&gt;
&lt;td&gt;0.000049&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.94810&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8.27646&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript (V8)&lt;/td&gt;
&lt;td&gt;0.001584&lt;/td&gt;
&lt;td&gt;13.90908&lt;/td&gt;
&lt;td&gt;27.45163&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;0.019030&lt;/td&gt;
&lt;td&gt;21.28324&lt;/td&gt;
&lt;td&gt;257.00624&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Por quê? O padrão de acesso do Gnome Sort — muitos acessos locais e trocas adjacentes — se beneficia especialmente das otimizações do compilador LLVM (backend do Rust), que gera código de swap em registrador sem acesso intermediário à memória.&lt;/p&gt;


&lt;h2&gt;
  
  
  📊 Resultados — Bubble Sort
&lt;/h2&gt;

&lt;p&gt;O Bubble Sort entregou o resultado mais inesperado de todo o projeto:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;N = 10⁵ — tempo em segundos (-O3 / otimização máxima)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Linguagem&lt;/th&gt;
&lt;th&gt;Crescente (s)&lt;/th&gt;
&lt;th&gt;Aleatório (s)&lt;/th&gt;
&lt;th&gt;Decrescente (s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C (-O3)&lt;/td&gt;
&lt;td&gt;0.000042&lt;/td&gt;
&lt;td&gt;20.489569&lt;/td&gt;
&lt;td&gt;23.568626&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++ (-O3)&lt;/td&gt;
&lt;td&gt;0.000045&lt;/td&gt;
&lt;td&gt;21.165759&lt;/td&gt;
&lt;td&gt;23.919268&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust (-O3)&lt;/td&gt;
&lt;td&gt;0.000051&lt;/td&gt;
&lt;td&gt;13.513529&lt;/td&gt;
&lt;td&gt;9.231813&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript (V8)&lt;/td&gt;
&lt;td&gt;0.001753&lt;/td&gt;
&lt;td&gt;15.012168&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;6.905683&lt;/strong&gt; 🎉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;0.003504&lt;/td&gt;
&lt;td&gt;312.509064&lt;/td&gt;
&lt;td&gt;403.412438&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;JavaScript bateu C e C++ no pior caso.&lt;/strong&gt; O motor V8 identificou o padrão repetitivo de trocas adjacentes e gerou código de máquina altamente especializado via JIT. É um caso raro onde a compilação dinâmica supera a compilação estática.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔑 Principais Aprendizados
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Otimização de compilador importa muito mais do que parece
&lt;/h3&gt;

&lt;p&gt;O impacto de &lt;code&gt;-O3&lt;/code&gt; vs &lt;code&gt;-O0&lt;/code&gt; para Rust no Bubble Sort chegou a &lt;strong&gt;23×&lt;/strong&gt; para N = 10⁴. Em modo debug, o Rust mantém verificações de &lt;em&gt;bounds checking&lt;/em&gt; em todo acesso ao array — correto para desenvolvimento, devastador para performance.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Adaptatividade é real e mensurável
&lt;/h3&gt;

&lt;p&gt;Insertion Sort com N = 10⁶ no cenário crescente: &lt;strong&gt;&amp;lt; 1 ms&lt;/strong&gt;. No cenário decrescente: &lt;strong&gt;até 3670 s&lt;/strong&gt; (sem otimização). Isso é uma diferença de &lt;strong&gt;mais de 10 ordens de magnitude&lt;/strong&gt; no número de operações.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Python tem overhead estrutural, não só de interpretador
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;list&lt;/code&gt; do Python armazena referências a objetos &lt;code&gt;PyObject&lt;/code&gt; — cada acesso e comparação envolve uma indireção de ponteiro. Isso multiplica o custo por operação mesmo para tipos simples como &lt;code&gt;int&lt;/code&gt; e &lt;code&gt;float&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. JIT pode superar código estático em padrões repetitivos
&lt;/h3&gt;

&lt;p&gt;O V8 observa o comportamento em runtime e especializa o código gerado. Para algoritmos com padrões de acesso altamente previsíveis (como Bubble Sort), isso pode ser mais eficiente que otimizações estáticas conservadoras de um compilador AOT.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. A hierarquia não é fixa
&lt;/h3&gt;

&lt;p&gt;A ordem geral foi &lt;code&gt;C ≈ C++ &amp;lt; Rust &amp;lt; JS &amp;lt; Python&lt;/code&gt;, mas exceções importantes existem — Rust venceu todos no Gnome Sort, JS venceu todos no Bubble Sort em pior caso. &lt;strong&gt;O melhor resultado depende do algoritmo, tamanho de entrada e padrão de acesso.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🔬 Conclusão
&lt;/h2&gt;

&lt;p&gt;Algoritmos simples ensinam mais do que complexidade assintótica. Ensinam sobre a relação entre padrões de acesso à memória e otimizações de compilador, sobre como compilação JIT funciona na prática, e sobre por que constantes importam tanto quanto expoentes para tamanhos reais de entrada.&lt;/p&gt;

&lt;p&gt;Se você quiser explorar o código completo, estrutura de Makefiles, geradores de dataset e scripts de benchmark, o repositório está público no GitHub.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Bernardo-Lebron" rel="noopener noreferrer"&gt;
        Bernardo-Lebron
      &lt;/a&gt; / &lt;a href="https://github.com/Bernardo-Lebron/simple_sort_algorithms" rel="noopener noreferrer"&gt;
        simple_sort_algorithms
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/83736464/589653029-919963f1-5b07-4d12-8862-191073dde33c.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Nzg5MDcxNjEsIm5iZiI6MTc3ODkwNjg2MSwicGF0aCI6Ii84MzczNjQ2NC81ODk2NTMwMjktOTE5OTYzZjEtNWIwNy00ZDEyLTg4NjItMTkxMDczZGRlMzNjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA1MTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNTE2VDA0NDc0MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMwNDljNzQwYmE4YjYyOThjNDIxYWQzMTQ0ZjhhZTg4MzgzYjNhMjg5Y2NkOTljODlkMjYyMmM3YjVkN2I0NGYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.jqNvjYdizcKoz6BqC4brPZiPiPGeXO-vV3SvOq8Cjv4"&gt;&lt;img width="1200" height="300" alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F83736464%2F589653029-919963f1-5b07-4d12-8862-191073dde33c.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Nzg5MDcxNjEsIm5iZiI6MTc3ODkwNjg2MSwicGF0aCI6Ii84MzczNjQ2NC81ODk2NTMwMjktOTE5OTYzZjEtNWIwNy00ZDEyLTg4NjItMTkxMDczZGRlMzNjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA1MTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNTE2VDA0NDc0MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMwNDljNzQwYmE4YjYyOThjNDIxYWQzMTQ0ZjhhZTg4MzgzYjNhMjg5Y2NkOTljODlkMjYyMmM3YjVkN2I0NGYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.jqNvjYdizcKoz6BqC4brPZiPiPGeXO-vV3SvOq8Cjv4" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Comparativo de Desempenho: Algoritmos de Ordenação Simples&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Este repositório contém um ambiente de benchmarking experimental para analisar e comparar o desempenho de quatro algoritmos de ordenação simples: &lt;strong&gt;Selection Sort&lt;/strong&gt;, &lt;strong&gt;Insertion Sort&lt;/strong&gt;, &lt;strong&gt;Gnome Sort&lt;/strong&gt; e &lt;strong&gt;Bubble Sort&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Os algoritmos são implementados em múltiplas linguagens de programação e avaliados sob diferentes tamanhos de entrada e cenários de ordenação, com o objetivo de verificar empiricamente as previsões teóricas de complexidade computacional.&lt;/p&gt;

&lt;p&gt;Trabalho prático da disciplina de &lt;strong&gt;Algoritmos e Estruturas de Dados I&lt;/strong&gt;
&lt;strong&gt;CEFET-MG — Campus V, Divinópolis&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📋 Sumário&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;O que são Métodos de Ordenação?&lt;/li&gt;
&lt;li&gt;Contextualização dos Algoritmos Simples&lt;/li&gt;
&lt;li&gt;Objetivos&lt;/li&gt;
&lt;li&gt;Estrutura do Projeto&lt;/li&gt;
&lt;li&gt;Algoritmos Analisados
&lt;ul&gt;
&lt;li&gt;5.1. Selection Sort&lt;/li&gt;
&lt;li&gt;5.2. Insertion Sort&lt;/li&gt;
&lt;li&gt;5.3. Gnome Sort&lt;/li&gt;
&lt;li&gt;5.4. Bubble Sort&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Metodologia Experimental&lt;/li&gt;
&lt;li&gt;Equipe e Colaboradores&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🤔 1. O que são Métodos de Ordenação?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Métodos de ordenação são algoritmos computacionais utilizados para reorganizar os elementos de uma estrutura de dados segundo uma ordem determinada…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Bernardo-Lebron/simple_sort_algorithms" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;&lt;em&gt;Trabalho prático da disciplina de Algoritmos e Estruturas de Dados I — CEFET-MG Campus V, Divinópolis. Orientação: Prof. Michel Pires.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>computerscience</category>
      <category>javascript</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
