Escolar Documentos
Profissional Documentos
Cultura Documentos
1 - Introdução
O Bubble Sort é conhecido como um dos algoritmos de ordenação mais simples, o motivo
de seu nome estar relacionado a uma bolha é devido ao comportamento do algoritmo
com os valores do vetor, de modo análogo, os valores a serem ordenados serão as
bolhas que estão dentro de um tanque de água, elas vão se organizar de acordo com
seu tamanho, ou seja, as volumosas ficarão no topo. O algoritmo trabalha de maneira
similar, percorre todo o vetor e verificando dois a dois quem é valor maior, assim o maior
é jogado para frente e o menor para trás, e assim sucessivamente com os outros valores
até estarem todos ordenados em ordem ascendente ou descendente.
Pseudo-Código em linguagem C:
Fonte do Pseudocódigo:
Biggar, P.; Gregg, D. Sorting in the Presence of Branch Prediction and Caches: Fast
Sorting on Modern Computers. https://www.scss.tcd.ie, 2005. Disponível em <
https://www.scss.tcd.ie/publications/tech-reports/reports.05/TCD-CS-2005-57.pdf >.
Acesso em 05/05/21
O merge sort usa como base o método de dividir e conquistar, o qual consiste em dividir
o vetor ao meio em vários sub-vetores até que reste um único elemento no vetor para
que ele possa começar a ser resolvido, após fazer comparações de qual é menor e maior,
o algoritmo volta combinando esses números em ordem crescente até que se obtenha a
solução.
Dividir e conquistar pode ser resumido em três partes:
1. Dividir: Dividir o vetor em sub-vetores em partes menores até que fique simples
para o algoritmo começar a se resolver.
2. Conquistar: Os sub-vetores resolve se recursivamente. Se eles forem pequenos
o suficiente, resolva os subproblemas como problemas base.
3. Combinar: Combina as soluções dos sub-vetores em uma solução para o
problema original.
Pseudocódigo:
procedure mergesort( var a as array )
if ( n == 1 ) return a
l1 = mergesort( l1 )
l2 = mergesort( l2 )
var c as array
while ( a and b have elements )
if ( a[0] > b[0] )
add b[0] to the end of c
remove b[0] from b
else
add a[0] to the end of c
remove a[0] from a
end if
end while
return c
end procedure
Fonte do pseudocódigo:
Data Structures - Merge Sort Algorithm. Tutorialspoint. disponível em:
<https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm>
Acesso em: 05/05/2021.
A história do Radix sort remonta à 1890, quando seu criador, Hermann Hollerith
trabalhava numa agência governamental encarregada de fazer o censo populacional.
Normalmente, o recenseamento da população demorava quase uma década para ser
feito mas, com a utilização da máquina de cartões perfurados criada por Hermann, esse
trabalho pôde ser realizado em apenas um ano.
O surgimento da classificação Radix se deu à necessidade de ordenar os cartões
perfurados a serem lidos por essas máquinas, de forma que não houvessem erros no
processamento das informações e foi realmente implementado na leitura desses cartões
perfurados em torno de 1923.
O primeiro algoritmo computadorizado que funcionava eficientemente surgiu somente
em 1954, criado por Harold. H. Seward, que também é criador do algoritmo counting sort,
o qual tem intima ligação com o Radix sort. Hodiernamente, o método do radix sort é
mais utilizado para coleções de strings binárias e inteiros. Sua eficiência é comparada a
outros algoritmos de comparação, sendo até superior quando abaixo de certos limites.
A ordenação em radix pode ocorrer de duas formas distintas: começando do algoritmo
menos significativo (LSD) ou do mais significativo (MSD), de forma que ordene em ordem
lexical cada digito até o maior digito do maior termo da string.
Algoritmos em LSD geralmente são mais estáveis.
Pseudocódigo:
Radix-Sort(A, d)
for j = 1 to d do
int count[10] = {0};
for i = 0 to n do
count[key of(A[i]) in pass j]++
for k = 1 to 10 do
count[k] = count[k] + count[k-1]
for i = n-1 downto 0 do
result[ count[key of(A[i])] ] = A[j]
count[key of(A[i])]--
for i=0 to n do
A[i] = result[i]
end for(j)
end func
Fonte do pseudocódigo:
Bisht, K. Radix Sort, 2019. Disponível em: < https://iq.opengenus.org/radix-sort/>
Acesso em: 05/05/2021
5 - Análise Assintótica
Para a realização da parte experimental do trabalho, foi utilizada uma máquina com as
seguintes especificações:
2000 0,11
3000 0,164 100
4000 0,198 80
5000 0,27
10000 0,643 60
20000 1,874
40
30000 3,775
40000 6,845 20
50000 10,048
75000 20,96 0
100000 35,714 0 50000 100000 150000 200000 250000
125000 54,408 quantidade de termos
150000 77,26
175000 104,553
200000 135,077
Tabela 2: Resultados Merge sort
Merge sort
8
6
tempo em segundos
0
0 50000 100000 150000 200000 250000 300000
quantidade de termos
Tabela 3: Resultados Radix Sort
Radix sort
8
6
tempo em segundos
0
0 50000 100000 150000 200000 250000
quantidade de termos
Para termos uma melhor visualização do que os gráficos nos representam, podemos uni-
los em um só:
140
120
tempo em segundos(s)
100
80 bubble sort
Radix sort
60 Merge Sort
40
20
0
0 50000 100000 150000 200000 250000 300000
quantidade de termos
7
tempo em segundos(s)
4
Radix
3 merge
2
0
0 50000 100000 150000 200000 250000 300000
quantidade de termos
Graficamente muito similares, até certo ponto os algoritmos Merge sort e Radix sort
mantêm tempos de processamento similares, mas quando o número de dígitos do maior
valor a ser ordenado é maior que (log(n)) o Merge se sobressaí sobre o Radix no tempo
de processamento.
Em termos de uso de memória o algoritmo Merge utiliza mais, pois cria um vetor a cada
subdivisão, sendo viável somente se "d" for maior que (log n), caso contrário recomenda-
se a utilização do Radix, que faz um uso de memória menor, mantendo seu desempenho.
7 - Referências
Cormen, Thomas H.; Leisenson, Charles E.; Rivest, Ronald L.; Stein, Clifford.
Introdução aos Algoritmos, segunda edição. MIT press e MCGraw-Hill, 2001.