Skip to content

Commit 7d42b83

Browse files
committed
Merge commit
2 parents d6e5a75 + 7bc47b4 commit 7d42b83

File tree

2 files changed

+102
-13
lines changed

2 files changed

+102
-13
lines changed

Python/timsort.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# Implementacao do algoritmo Timsort
2+
# Referencia: https://www.geeksforgeeks.org/timsort/
3+
4+
RUN = 32
5+
6+
7+
def insertion_sort(data, left, right):
8+
"""Use insertion sort to sort the dataay from the left
9+
index to the right index which is of size atmost RUN.
10+
"""
11+
for index in range(left+1, right+1):
12+
temp = data[index]
13+
prev_index = index - 1
14+
while prev_index >= left and data[prev_index] > temp:
15+
data[prev_index+1] = data[prev_index]
16+
prev_index -= 1
17+
data[prev_index+1] = temp
18+
19+
20+
def merge_sort(data, left, mid, right):
21+
"""Merge sort function responsible for merging the sorted runs."""
22+
# The data is splited in two parts
23+
left_len = mid - left + 1
24+
left_part = [data[left+i] for i in range(0, left_len)]
25+
26+
right_len = right - mid
27+
right_part = [data[mid+1+i] for i in range(0, right_len)]
28+
29+
left_index, right_index, data_index = 0, 0, left
30+
31+
# After comparing, we merge those two lists in larger sub list
32+
while left_index < left_len and right_index < right_len:
33+
if left_part[left_index] <= right_part[right_index]:
34+
data[data_index] = left_part[left_index]
35+
left_index += 1
36+
else:
37+
data[data_index] = right_part[right_index]
38+
right_index += 1
39+
data_index += 1
40+
41+
# Copy remaining elements from the left part
42+
while left_index < left_len:
43+
data[data_index] = left_part[left_index]
44+
data_index += 1
45+
left_index += 1
46+
47+
# Copy remaining elements from the right part
48+
while right_index < right_len:
49+
data[data_index] = right_part[right_index]
50+
data_index += 1
51+
right_index += 1
52+
53+
54+
def timsort(data):
55+
"""Iterative Timsort algorithm."""
56+
n = len(data)
57+
58+
# Sort individual sub lists of size RUN
59+
for i in range(0, n, RUN):
60+
insertion_sort(data, i, min((i+31), (n-1)))
61+
62+
# Start merging from size RUN.
63+
# It will merge to form size 64, 128, 256 and so on
64+
size = RUN
65+
while size < n:
66+
for left in range(0, n, 2*size):
67+
# Find ending point of left sub list
68+
# mid+1 is starting point of right sub dataay
69+
mid = left + size - 1
70+
right = min((left+2*size-1), (n-1))
71+
72+
# Merge sub list data[left.....mid] & data[mid+1....right]
73+
merge_sort(data, left, mid, right)
74+
75+
# After every merge, we increase left by 2 * size
76+
size = 2 * size
77+
78+
79+
if __name__ == '__main__':
80+
data = [99, 15, 23, 0, -9, 1, 45, 2, 10, 15]
81+
print('Unsorted data: ', data)
82+
timsort(data)
83+
print('Sorted data: ', data)

README.md

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@
22

33
Este repositório disponibiliza alguns algoritmos e estruturas de dados clássicos em Ciência da Computação. Além disso, disponibiliza também alguns problemas extras que são encontrados com frequência em desafios de programação.
44

5-
Com o objetivo de alcançar uma abrangência maior e encorajar novas pessoas a contribuir com o projeto, os algoritmos são disponibilizados nas seguintes linguagens: C/C++, Java, Python, Go e Ruby.
5+
Com o objetivo de alcançar uma abrangência maior e encorajar novas pessoas a contribuir com o projeto, os algoritmos são disponibilizados nas seguintes linguagens: C/C++, Java, Python, Go, Ruby e Javascript.
66

77
| Algoritmos | C/C++ | Java | Python | Go | Ruby | Javascript |
88
|-------------------------------------|-------|------|--------|----|------|------------|
99
| [Algoritmo Dijkstra][1] | [C/C++](/C/AlgoritmoDijkstra.c) | Java | Python | Go | Ruby | Javascript |
1010
| [Algoritmo Floyd Warshall][2] | [C/C++](/C/AlgoritmoFloydWarshall.c) | Java | Python | Go | Ruby | Javascript |
11-
| [Árvore Binária de Busca][3] | [C/C++](/C/ArvoreBinariaDeBusca.c) | [Java](/Java/ArvoreDeBuscaBinaria.java) | [Python](/Python/arvore_binaria_de_busca.py) | Go | Ruby | [Javascript](/Javascript/ArvoreDeBuscaBinaria.js) |
12-
| [Árvore Binária Utilizando Classes][4] | C/C++ | Java | [Python](/Python/BinaryTree.py) | Go | Ruby | Javascript |
1311
| [Busca Binária][5] | [C/C++](/C/BinarySearch.cpp) | Java | [Python](/Python/BuscaBinaria.py) | Go | [Ruby](/Ruby/BuscaBinaria.rb) | Javascript |
1412
| [Busca em Grafos][6] | [C/C++](/C/BuscaEmGrafo.c) | Java | Python | Go | Ruby | Javascript |
1513
| [Busca Sequencial][7] | C/C++ | Java | [Python](/Python/BuscaSequencial.py) | Go | [Ruby](/Ruby/BuscaSequencial.rb) | [Javascript](/Javascript/BuscaLinear.js) |
@@ -19,29 +17,34 @@ Com o objetivo de alcançar uma abrangência maior e encorajar novas pessoas a c
1917
| [Caixeiro Viajante][10] | [C/C++](/C/CaixeiroViajante.c) | Java | Python | [Go](/Go/caixeiroviajante/caixeiroviajante.go) | Ruby | Javascript |
2018
| [Ciclo Hamiltoniano][11] | [C/C++](/C/CicloHamiltoniano.c) | Java | Python | Go | Ruby | Javascript |
2119
| [Componentes Conexos][12] | [C/C++](/C/ComponentesConexos.c) | Java | Python | Go | Ruby | Javascript |
22-
| [Deque][52] | C/C++ | Java | Python | Go | Ruby | [Javascript](/Javascript/Deque.js) |
20+
| [Deque][54] | C/C++ | Java | Python | Go | Ruby | [Javascript](/Javascript/Deque.js) |
2321
| [Exponenciação][13] | [C/C++](/C/Exponenciacao.c) | Java | [Python](/Python/Exponenciacao.py) | [Go](/Go/exponenciacao/exponenciacao.go) | [Ruby](/Ruby/Exponenciacao.rb) | Javascript |
2422
| [Exponenciação Recursiva][14] | [C/C++](/C/ExponenciacaoRecursiva.c) | Java | [Python](/Python/ExponenciacaoRecursiva.py) | Go | [Ruby](/Ruby/ExponenciacaoRecursiva.rb) | Javascript |
2523
| [Fatorial][15] | [C/C++](/C/Fatorial.c) | [Java](/Java/Fatorial.java) | [Python](/Python/Fatorial.py) | [Go](/Go/fatorial/fatorial.go) | [Ruby](/Ruby/Fatorial.rb) | Javascript |
2624
| [Fatorial Recursiva][16] | [C/C++](/C/FatorialRecursiva.c) | [Java](/Java/FatorialRecursiva.java) | [Python](/Python/FatorialRecursiva.py) | Go | [Ruby](/Ruby/Fatorial.rb) | Javascript |
2725
| [Fibonacci][17] | [C/C++](/C/Fibonacci.cpp) | [Java](/Java/Fibonacci.java) | [Python](/Python/Fibonacci.py) | [Go](/Go/fibonacci/fibonacci.go) | [Ruby](/Ruby/Fibonacci.rb) | Javascript |
26+
| [Máximo Recursivo][26] | [C/C++](/C/MaxRecursivo.c) | Java | Python | Go | Ruby | Javascript |
27+
| [Mínimo e Máximo Iterativo][27] | C/C++ | [Java](/Java/MaxMinArray.java) | [Python](/Python/MinMaxIterativo.py) | Go | Ruby | Javascript |
28+
| [Mínimo e Máximo Recursivo][28] | [C/C++](/C/MaxMinRecursivo.c) | Java | [Python](/Python/MaxMinRecursivo.py) | [Go](/Go/maximominimo/MaximoMinimo.go) | Ruby | Javascript |
29+
| Mínimo e Máximo Divisão e Conquista | C/C++ | Java | [Python](/Python/MaxRecursivoDC.py) | [Go](/Go/maximominimo/MaximoMinimo.go) | Ruby | Javascript |
30+
| [Passeio do Cavalo][30] | C/C++ | Java | [Python](/Python/PasseioDoCavalo.py) | Go | Ruby | Javascript |
31+
| [Torre de Hanói][33] | C/C++ | [Java](/Java/TorreDeHanoi.java) | [Python](/Python/TorreDeHanoi.py) | [Go](/Go/hanoi/hanoi.go) | [Ruby](/Ruby/Hanoi.rb) | Javascript |
32+
| [Algoritmo Genético][51] | C/C++ | Java | [Python](/Python/genetic_algorithm.py) | Go | Ruby | Javascript |
33+
34+
| Estruturas de Dados | C/C++ | Java | Python | Go | Ruby | Javascript |
35+
|-------------------------------------|-------|------|--------|----|------|------------|
36+
| [Árvore Binária de Busca][3] | [C/C++](/C/ArvoreBinariaDeBusca.c) | [Java](/Java/ArvoreDeBuscaBinaria.java) | [Python](/Python/arvore_binaria_de_busca.py) | Go | Ruby | [Javascript](/Javascript/ArvoreDeBuscaBinaria.js) |
37+
| [Árvore Binária Utilizando Classes][4] | C/C++ | Java | [Python](/Python/BinaryTree.py) | Go | Ruby | Javascript |
2838
| [Fila][18] | [C/C++](/C/Fila.c) | [Java](/Java/Fila.java) | [Python](/Python/Fila.py) | Go | [Ruby](/Ruby/Fila.rb) | [Javascript](/Javascript/Fila.js) |
2939
| [Fila Encadeada Dinâmica][19] | [C/C++](/C/FilaEncadeadaDinamica.c) | Java | Python | Go | Ruby | Javascript |
3040
| [Grafo][20] | [C/C++](/C/Grafos.c) | Java | Python | Go | Ruby | Javascript |
31-
| Lista Circular Ligada | [C/C++](/C/ListaCircularLigada.c) | Java | [Python](/Python/ListaEncadeadaCircular.py) | Go | Ruby | Javascript |
41+
| [Lista Circular Ligada][52] | [C/C++](/C/ListaCircularLigada.c) | Java | [Python](/Python/ListaEncadeadaCircular.py) | Go | Ruby | Javascript |
3242
| [Lista Encadeada][22] | C/C++ | Java | [Python](/Python/ListaEncadeada.py) | Go | Ruby | [Javascript](/Javascript/ListaSimplesmenteEncadeada.js) |
3343
| [Lista Duplamente Encadeada][23] | [C/C++](/C/ListaDuplamenteEncadeada.c) | [Java](/Java/ListaDuplamenteEncadeada.java) | [Python](/Python/ListaDuplamenteEncadeada.py) | Go | Ruby | [Javascript](/Javascript/ListaDumplamenteEncadeada.js) |
3444
| [Lista Ligada Não Ordenada][24] | [C/C++](/C/ListaLigadaNaoOrdenada.c) | Java | Python | Go | Ruby | Javascript |
3545
| Lista Sequencial Ordenada | [C/C++](/C/ListaSequencialOrdenada.c) | Java | [Python](/Python/ListaSequencialOrdenada.py) | Go | Ruby | Javascript |
36-
| [Máximo Recursivo][26] | [C/C++](/C/MaxRecursivo.c) | Java | Python | Go | Ruby | Javascript |
37-
| [Mínimo e Máximo Iterativo][27] | C/C++ | [Java](/Java/MaxMinArray.java) | [Python](/Python/MinMaxIterativo.py) | Go | Ruby | Javascript |
38-
| [Mínimo e Máximo Recursivo][28] | [C/C++](/C/MaxMinRecursivo.c) | Java | [Python](/Python/MaxMinRecursivo.py) | [Go](/Go/maximominimo/MaximoMinimo.go) | Ruby | Javascript |
39-
| Mínimo e Máximo Divisão e Conquista | C/C++ | Java | [Python](/Python/MaxRecursivoDC.py) | [Go](/Go/maximominimo/MaximoMinimo.go) | Ruby | Javascript |
40-
| [Passeio do Cavalo][30] | C/C++ | Java | [Python](/Python/PasseioDoCavalo.py) | Go | Ruby | Javascript |
4146
| [Pilha][31] | [C/C++](/C/Pilha.c) | [Java](/Java/Pilha.java) | [Python](/Python/Pilha.py) | Go | [Ruby](/Ruby/Pilha.rb) | [Javascript](/Javascript/Pilha.js) |
4247
| Pilha Ligada Dinâmica | [C/C++](/C/PilhaLigadaDinamica.c) | Java | Python | Go | Ruby | Javascript |
43-
| [Torre de Hanói][33] | C/C++ | [Java](/Java/TorreDeHanoi.java) | [Python](/Python/TorreDeHanoi.py) | [Go](/Go/hanoi/hanoi.go) | [Ruby](/Ruby/Hanoi.rb) | Javascript |
44-
| [Algoritmo Genético][51] | C/C++ | Java | [Python](/Python/genetic_algorithm.py) | Go | Ruby | Javascript |
4548

4649
| Algoritmos de Ordenação | C/C++ | Java | Python | Go | Ruby | Javascript |
4750
|-------------------------------------|-------|------|--------|----|------|------------|
@@ -60,6 +63,7 @@ Com o objetivo de alcançar uma abrangência maior e encorajar novas pessoas a c
6063
| [Radix Sort][46] | C/C++ | [Java](/Java/RadixSort.java) | Python | [Go](/Go/radixsort/radixsort.go) | [Ruby](/Ruby/radix_sort.rb) | Javascript |
6164
| [Selection Sort][47] | [C/C++](/C/SelectionSort.cpp) | [Java](/Java/SelectionSort.java) | [Python](/Python/SelectionSort.py) | [Go](/Go/selectionsort/selectionsort.go) | [Ruby](/Ruby/selection_sort.rb) | [Javascript](/Javascript/SelectionSort.js) |
6265
| [Shell Sort][48] | C/C++ | [Java](/Java/ShellSort.java) | [Python](/Python/shellSort.py) | [Go](/Go/shellsort/shellsort.go) | Ruby | [Javascript](/Javascript/ShellSort.js) |
66+
| [Timsort][53] | C/C++ | Java | [Python](/Python/timsort.py) | Go | Ruby | Javascript |
6367

6468
| Extras | C/C++ | Java | Python | Go | Ruby | Javascript |
6569
|-------------------------------------|-------|------|--------|----|------|------------|
@@ -122,4 +126,6 @@ Se você tem dúvida de como contribuir, dê uma olhada no arquivo [CONTRIBUTING
122126
[49]: https://pt.wikipedia.org/wiki/Pal%C3%ADndromo
123127
[50]: https://pt.wikipedia.org/wiki/F%C3%B3rmula_de_Leibniz_para_%CF%80
124128
[51]: https://pt.wikipedia.org/wiki/Algoritmo_gen%C3%A9tico
125-
[52]: https://pt.wikipedia.org/wiki/Deque_(estruturas_de_dados)
129+
[52]: https://www.youtube.com/watch?v=bxwIm3F6aaQ
130+
[53]: https://en.wikipedia.org/wiki/Timsort
131+
[54]: https://pt.wikipedia.org/wiki/Deque_(estruturas_de_dados)

0 commit comments

Comments
 (0)