func permutation_sort(A):
for B in permutations(A):
if is_sorted(B):
return B
Complexidade de Tempo: $O(n! \times n)$
Complexidade de Espaço: $O(1)$
insertion sort
tem $O(n^{2})$ para o pior caso e $\Omega(n)$ para o melhor caso. func merge_sort(A, i = 0, j = A.length - 1):
if 1 < j - 1:
m = i + (j - 1) / 2
merge_sort(A, i, m)
merge_sort(A, m + 1, j)
A = merge(A, i, m, A, m + 1, j)
func merge(A, sa, ea, B, sb, eb):
C = Array((ea - sa) + (eb - sb))
i = ea
j = eb
k = C.length
while sa < i and sb < j:
k -= 1
if A[i] < A[j]:
C[k] = A[i]
i -= 1
else:
C[k] = A[j]
j -= 1
while sa < i:
C[k] = A[i]
i -= 1
while sb < j:
C[k] = A[j]
j -= 1
return C
Merge Sort
tem complexidade de tempo $O(n\times\log{n})$ e $\Omega(n\times\log{n})$ (ou seja $\Theta(n\times\log{n})$), sendo um algoritmo de ordenação ótimo em relação ao modelo de comparação.merge sort
é $O(n)$.merge sort
é um algoritmo estável em relação às chaves ordenadas.timsort
utilizado pelo Python e pelo Java é baseado no merge sort
.Pidgeonhole Sorting
:
L = array de k listas vazias
for j in 0...(n-1):
L[key(A[j])].append(A[j])
output = []
for i in 0..(k-1):
output.extend(L[k])
Counting Sort
Counting sort
:
function CountingSort(input, k)
count ← array of k + 1 zeros
output ← array of same length as input
for i = 0 to length(input) - 1 do
j = key(input[i])
count[j] = count[j] + 1
for i = 1 to k do
count[i] = count[i] + count[i - 1]
for i = length(input) - 1 down to 0 do
j = key(input[i])
count[j] = count[j] - 1
output[count[j]] = input[i]
return output
counting sort
é estável.Radix Sort
Selection Sort
não é estável para as chaves.Insertion Sort
seja estável para as chaves?Quicksort
. Qual a complexidade de espaço utilizada na sua implementação?max_heap
, o algoritmo Heapsort
tem complexidade de tempo $\Theta(n\log{n})$ e de espaço $O(1)$. Escreva um artigo, de no máximo duas páginas, incluindo o código ou pseudocódgio do algoritmo, e demonstrando a sua complexidade. Crie uma hipótese para o motivo dele não ser estável em relação à ordenaçào das chaves.