Repositório para o curso de Análise e Projeto de Algorítmos 2024.2 da @UFPB
Para as análises considerarei como operações básicas:
- Expressões de avaliação
- Atribuições de valores a variáveis
- Indexação de um array
- Retorno de funções
buscaSequencial(x, A)
1. i = 0
2. while i <= n and A[i] != x:
3. i = i+1
4. if i > n:
5. return -1
6. return iNo pior caso o elemento buscado não está no array
buscaSequencial(x, A) # op exec op * exec
1. i = 0 # 1 1 1
2. while i <= n and A[i] != x: # 4 n 4n
3. i = i+1 # 2 n 2n
4. if i > n: # 1 1 1
5. return -1 # 1 1 1
6. return i # 1 0 0No melhor caso o elemento que buscamos está no primeiro índice do array de entrada.
buscaSequencial(x, A) # op exec op * exec
1. i = 0 # 1 1 1
2. while i <= n and A[i] != x: # 4 1 4
3. i = i+1 # 2 0 0
4. if i > n: # 1 1 1
5. return -1 # 1 0 0
6. return i # 1 1 1contaOcorrencias(x, A, n)
1. cont = 0
2. for i = 0 to n-1:
3. if A[i] == x:
4. cont++
5. return contNo pior caso, todos os elementos do array são iguais a x.
contaOcorrencias(x, A, n) # op exec op * exec
1. cont = 0 # 1 1 1
2. for i = 0 to n-1: # 3 n 3n
3. if A[i] == x: # 2 n 2n
4. cont++ # 1 n n
5. return cont # 1 1 1No melhor caso o elemento que queremos contar não está no array.
contaOcorrencias(x, A, n) # op exec op * exec
1. cont = 0 # 1 1 1
2. for i = 0 to n-1: # 3 n 3n
3. if A[i] == x: # 2 n 2n
4. cont++ # 1 0 0
5. return cont # 1 1 1ArrayMax(A, n)
1. currentMax = A[0]
2. for i = 1 to n − 1:
3. if A[i] > currentMax:
4. currentMax = A[i]
5. i++
6. return currentMaxNo pior caso o maior elemento está no final do array.
ArrayMax(A, n) # op exec op * exec
1. currentMax = A[0] # 2 1 2
2. for i = 1 to n − 1: # 2 n-1 2n-2
3. if A[i] > currentMax: # 2 n-1 2n-2
4. currentMax = A[i] # 2 n-1 2n-2
5. i++ # 1 n-1 n-1
6. return currentMax # 1 1 1No melhor caso o maior elemento é o primeiro ou todos são iguais.
ArrayMax(A, n) # op exec op * exec
1. currentMax = A[0] # 2 1 2
2. for i = 1 to n − 1: # 2 n-1 2n-2
3. if A[i] > currentMax: # 2 n-1 2n-2
4. currentMax = A[i] # 2 0 0
5. i++ # 1 n-1 n-1
6. return currentMax # 1 1 1fibonacci2(n)
1. if n = 0
2. return 0
3. crie um vetor f[0...n]
4. f[0] = 0
5. f[1] = 1
6. for i = 2...n:
7. f[i] = f[i-1] + f[i-2]
8. return f[n]No pior caso, n > 0
fibonacci2(n) # op exec op * exec
1. if n = 0 # 1 1 1
2. return 0 # 1 0 0
3. crie um vetor f[0...n] # n 1 n
4. f[0] = 0 # 2 1 2
5. f[1] = 1 # 2 1 2
6. for i = 2...n: # 2 n-2 2n-4
7. f[i] = f[i-1] + f[i-2] # 7 n-2 7n-14
8. return f[n] # 2 1 2No melhor caso, n = 0
fibonacci2(n) # op exec op * exec
1. if n = 0 # 1 1 1
2. return 0 # 1 1 1
3. crie um vetor f[0...n] # n 0 0
4. f[0] = 0 # 2 0 0
5. f[1] = 1 # 2 0 0
6. for i = 2...n: # 2 0 0
7. f[i] = f[i-1] + f[i-2] # 7 0 0
8. return f[n] # 2 0 0Animação por Mark M Bowman
InsertionSort(A, n)
1. pivo ← null
2. for i ← 1 to n – 1:
3. pivo ← A[i]
4. j ← i - 1
5. while j ≥ 0 and A[j] > pivo:
6. A[j+1] ← A[j]
7. j ← j - 1
8. A[j+1] ← pivo
9. return AO array está ordenado ao contrário
InsertionSort(A, n) # op exec op * exec
1. pivo ← null # 1 1 1
2. for i ← 1 to n – 1: # 2 n-1 2(n-1)
3. pivo ← A[i] # 2 n-1 2(n-1)
4. j ← i - 1 # 2 n-1 2(n-1)
5. while j ≥ 0 and A[j] > pivo: # 4 (n-1)(1+n-1)/2 => (n-1)n/2 => n^2-n/2 4(n^2-n/2)
6. A[j+1] ← A[j] # 4 (n-1)(1+n-1)/2 4(n^2-n/2)
7. j ← j - 1 # 2 (n-1)(1+n-1)/2 2(n^2-n/2)
8. A[j+1] ← pivo # 3 n-1 3(n-1)
9. return A # 1 1 1É possível identificar que o padrão de iteração na linha 5 é de uma progressão aritimética
No melhor caso o vetor de entrada já está ordenado.
InsertionSort(A, n) # op exec op * exec
1. pivo ← null # 1 1 1
2. for i ← 1 to n – 1: # 2 n-1 2(n-1)
3. pivo ← A[i] # 2 n-1 2(n-1)
4. j ← i - 1 # 2 n-1 2(n-1)
5. while j ≥ 0 and A[j] > pivo: # 4 n-1 4(n-1)
6. A[j+1] ← A[j] # 4 0 0
7. j ← j - 1 # 2 0 0
8. A[j+1] ← pivo # 3 n-1 3(n-1)
9. return A # 1 1 1Animação por Mark M Bowman
SelectionSort(A, n)
1. for i ← 0 to n – 2:
2. i_min ← i
3. for j ← i+1 to n – 1:
4. if A[j] < A[i_min]:
5. i_min ← j
6. if A[i] ≠ A[i_min]:
7. temp ← A[i]
8. A[i] ← A[i_min]
9. A[i_min] ← temp
10.return ADigamos que as condicionais da linha 4 e 5 sempre serão verdadeiras.
SelectionSort(A, n) # op exec op * exec
1. for i ← 0 to n – 2: # 2 n-1 2(n-1)
2. i_min ← i # 1 n-1 1(n-1)
3. for j ← i+1 to n – 1: # 3 (n-1)(n-1+1)/2 3(n^2-n/2)
4. if A[j] < A[i_min]: # 3 (n-1)(n-1+1)/2 3(n^2-n/2)
5. i_min ← j # 1 (n-1)(n-1+1)/2 1(n^2-n/2)
6. if A[i] ≠ A[i_min]: # 3 n-1 3(n-1)
7. temp ← A[i] # 2 n-1 2(n-1)
8. A[i] ← A[i_min] # 3 n-1 3(n-1)
9. A[i_min] ← temp # 2 n-1 2(n-1)
10.return A # 1 1 1O vetor já está ordenado.
SelectionSort(A, n) # op exec op * exec
1. for i ← 0 to n – 2: # 2 n-1 2(n-1)
2. i_min ← i # 1 n-1 1(n-1)
3. for j ← i+1 to n – 1: # 3 (n-1)(n-1+1)/2 3(n^2-n/2)
4. if A[j] < A[i_min]: # 3 (n-1)(n-1+1)/2 3(n^2-n/2)
5. i_min ← j # 1 0 0
6. if A[i] ≠ A[i_min]: # 3 n-1 3(n-1)
7. temp ← A[i] # 2 0 0
8. A[i] ← A[i_min] # 3 0 0
9. A[i_min] ← temp # 2 0 0
10.return A # 1 1 11 Função BubbleSort(entrada: Lista) : Lista
2 repita
3 houveTroca = Falso;
4 para i = 0 até Tamanho(entrada) - 1 faça
5 se entrada[i] > entrada[i+1] então
6 Troca(entrada[i], entrada[i+1]);
7 houveTroca = Verdadeiro;
8 fim
9 fim
10 até !houveTroca;
11 fimO array está ordenado em ordem decrescente. Nesse caso, a condição da linha 5 será verdadeira executando as linhas 6 e 7
Definindo as funções Tamanho(entrada) e Trocar(a, b)
1. Tamanho(entrada): # op exec op * exec
2. return entrada.size # 1 1 11. Trocar(a, b): # op exec op * exec
2. aux = a # 1 1 1
3. a = b # 1 1 1
4. b = aux # 1 1 11 Função BubbleSort(entrada: Lista) : Lista # op exec op * exec
2 repita # 1 n 1n
3 houveTroca = Falso; # 1 n 1n
4 para i = 0 até Tamanho(entrada) - 1 faça # 3 n(n-1) 3(n^2-n)
5 se entrada[i] > entrada[i+1] então # 4 n(n-1) 4(n^2-n)
6 Troca(entrada[i], entrada[i+1]); # 6 (n-1)(1+n-1)/2 6(n^2-n)/2
7 houveTroca = Verdadeiro; # 1 (n-1)(1+n-1)/2 1(n^2-n)/2
8 fim # 0 n-1 0
9 fim # 0 n-1 0
10 até !houveTroca; # 1 n 1n
11 fim # 0 1 0O array já está ordenado em ordem crescente. Nesse caso, a condição da linha 5 sempre falhará executando as linhas 6 e 7 0 vezes e, consequentemente, executando a linha 2 apenas 1 vez.
1 Função BubbleSort(entrada: Lista) : Lista # op exec op * exec
2 repita # 1 1 1
3 houveTroca = Falso; # 1 1 1
4 para i = 0 até Tamanho(entrada) - 1 faça # 3 n-1 3(n-1)
5 se entrada[i] > entrada[i+1] então # 4 n-1 4(n-1)
6 Troca(entrada[i], entrada[i+1]); # 6 0 0
7 houveTroca = Verdadeiro; # 1 0 0
8 fim # 0 n-1 0
9 fim # 0 n-1 0
10 até !houveTroca; # 1 1 1
11 fim # 0 1 0

