Batalha de Velocidades: Bubble Sort vs. Quick Sort - Uma Análise Experimental

Batalha de Velocidades: Bubble Sort vs. Quick Sort - Uma Análise Experimental

Edilson Rogério Cuambe

Edilson Rogério Cuambe

21 de abril de 2024

Em um mundo onde a eficiência de processamento é crucial, escolher o algoritmo de ordenação correto pode fazer uma diferença significativa no desempenho de uma aplicação. Este artigo apresenta uma comparação prática entre dois algoritmos populares de ordenação: Bubble Sort e Quick Sort.

Implementação dos Algoritmos

Bubble Sort

O Bubble Sort é um método simples que revisa repetidamente a lista, comparando elementos adjacentes e trocando-os se estiverem na ordem errada. Este processo se repete até que nenhum elemento precise ser trocado, indicando que a lista está ordenada.

1def bubble_sort(arr): 2 n = len(arr) 3 for i in range(n): 4 for j in range(0, n-i-1): 5 if arr[j] > arr[j+1]: 6 arr[j], arr[j+1] = arr[j+1], arr[j] 7 return arr

Complexidade

A complexidade deste algoritmo é O(n^2), o que o torna inadequado para lidar com grandes volumes de dados devido ao aumento quadrático no tempo de execução conforme o tamanho da lista cresce.

Quick Sort

O Quick Sort utiliza uma estratégia de divisão e conquista, escolhendo um 'pivô' e particionando os outros elementos em dois subconjuntos, que são então ordenados recursivamente.

1def quick_sort(arr): 2 if len(arr) <= 1: 3 return arr 4 else: 5 pivot = arr[len(arr) // 2] 6 left = [x for x in arr if x < pivot] 7 middle = [x for x in arr if x == pivot] 8 right = [x for x in arr if x > pivot] 9 return quick_sort(left) + middle + quick_sort(right)

Complexidade

A complexidade média do Quick Sort é O(n log n), muito mais eficiente para listas grandes do que o Bubble Sort.

Experimento Prático

Geração de Dados e Configuração

O experimento foi conduzido com uma lista de 10.000 números inteiros aleatórios. Usamos Python para gerar esses dados e para medir o tempo de execução de cada algoritmo.

1import random 2import time 3import copy 4import matplotlib.pyplot as plt 5 6def generate_data(file_path, num_items): 7 with open(file_path, 'w') as file: 8 for _ in range(num_items): 9 file.write(f"{random.randint(0, 999999)}\n") 10 11def read_numbers(file_path): 12 with open(file_path, 'r') as file: 13 numbers = [int(line.strip()) for line in file] 14 return numbers 15 16file_path = "random_numbers.txt" 17num_items = 10000 18generate_data(file_path, num_items) 19numbers = read_numbers(file_path)

Medindo o Tempo de Execução

Cada algoritmo recebeu uma cópia idêntica dos dados para garantir uma comparação justa.

1numbers_bubble = copy.deepcopy(numbers) 2numbers_quick = copy.deepcopy(numbers) 3 4time_bubble = measure_time(bubble_sort, numbers_bubble) 5time_quick = measure_time(quick_sort, numbers_quick)

Visualização dos Resultados

Os resultados do tempo de execução foram plotados em um gráfico de barras para uma comparação visual clara entre os dois algoritmos.

1plt.figure(figsize=(10, 6)) 2plt.bar(['Bubble Sort (O(n^2))', 'Quick Sort (O(n log n))'], [time_bubble, time_quick], color=['blue', 'green']) 3plt.title('Comparação de Tempo de Execução de Algoritmos de Ordenação') 4plt.ylabel('Tempo de Execução (segundos)') 5plt.xlabel('Algoritmos') 6plt.show()

Comparação de Tempo de Execução de Algoritmos de Ordenação

Figure_1.png

A imagem é um gráfico de barras que compara o tempo de execução dos algoritmos Bubble Sort e Quick Sort. As barras representam o tempo de execução em segundos. A barra azul representa o Bubble Sort e a barra verde representa o Quick Sort.

Nesta imagem, podemos ver claramente como os algoritmos se comportam em termos de eficiência. O Quick Sort, representado pela barra verde, tem um tempo de execução significativamente menor em comparação com o Bubble Sort, representado pela barra azul. Isso ilustra a eficiência superior do Quick Sort em relação ao Bubble Sort para uma lista de tamanho considerável.

Os Algoritmos

Entre o Bubble Sort e o Quick Sort, o Quick Sort é geralmente muito mais rápido e eficiente para a maioria dos conjuntos de dados, especialmente quando o número de elementos é grande.

Razões da Eficiência do Quick Sort:

  1. Complexidade de Tempo:

    • Bubble Sort: Tem uma complexidade de tempo média e no pior caso de (O(n^2)), onde (n) é o número de elementos a serem ordenados. Isso ocorre porque ele precisa comparar cada par de elementos adjacentes várias vezes até que toda a lista esteja ordenada.
    • Quick Sort: Tem uma complexidade de tempo média de (O(n \log n)) e, no pior caso, (O(n^2)). No entanto, o pior caso é raramente encontrado se o pivô for escolhido adequadamente (como usando a mediana ou um elemento aleatório). A complexidade média de (O(n \log n)) torna-o significativamente mais rápido que o Bubble Sort para a maioria dos cenários práticos.
  2. Recursão e Particionamento:

    • O Quick Sort usa uma abordagem de divisão e conquista, dividindo a lista em partes menores, o que pode ser mais eficientemente ordenado. Este método de particionamento e a recusão utilizada para resolver cada parte fazem com que ele seja muito mais eficaz em lidar com grandes conjuntos de dados.
  3. Movimentações de Dados:

    • Enquanto o Bubble Sort troca elementos adjacentes repetidamente através de múltiplas passagens pela lista, o Quick Sort pode realizar menos trocas de dados em geral, pois reorganiza os elementos em torno dos pivôs em grandes saltos.

Conclusão:

Portanto, o Quick Sort é preferido sobre o Bubble Sort em quase todas as aplicações práticas devido à sua eficiência em termos de tempo e capacidade de lidar bem com grandes volumes de dados. Isso é evidenciado pelo fato de que o Quick Sort é frequentemente escolhido para implementações internas de funções de ordenação em muitas linguagens de programação e bibliotecas padrão.

Nos usamos cookies em nosso site para melhorar a sua experiência.