Documente Academic
Documente Profesional
Documente Cultură
Ordenao e Pesquisa
2
Ordenao e Pesquisa
4
Estrutura de Dados
l Vetores
l Mantm uma srie de elementos sequenciais
mantidos em uma ordem linear como um nico,
porm, com possibilidade de acesso individual;
l Cada elemento possui um ndice que indica sua
posio no vetor e permite acess-lo diretamente;
l Vetores tem tamanhos fixos.
ndice 0 1 2 3 4 5
Valor 4 8 15 16 23 42
5
Pesquisa
? ? ? ? ? ?
6
Mtodos de Pesquisa
l Pesquisa Sequencial
l Pesquisa Binria
7
Pesquisa Sequencial
l Mtodo intuitivo:
l Dada uma chave k, compar-la a cada chave no
vetor, caso haja uma igual, a chave est no vetor
l Caso todas as chaves tenham sido comparadas e no
houve nenhuma igual, a chave no existe no vetor.
k=8
42 16 4 15 8 23
Chave encontrada! 8
Pesquisa Sequencial
Cdigo
!
! n, int k, int *posicao)!
int Sequencial(int A[], int
{! !
int i;! !
int achou = 0;! //sinaliza se a chave foi encontrada!
! !
for(i=0; i<n; i++)! //para cada chave!
if(A[i] == k)! //compara com a chave de busca!
{! !
*posicao = i;! //se encontrou!
achou = 1;! //armazena a posio!
}! !
! return achou;! //indica se encontrou ou no!
}!
9
Pesquisa Sequencial
Complexidade
int Sequencial(int A[], int n, int k, int *posicao)!
{!
int i;! Custo Repeties
int achou = 0;! !
! !
for(i=0; i<n; i++)! c1 ! !n!
if(A[i] == k)! c2 !n-1!
{!
*posicao = i;!
achou = 1;!
}!
return achou;!
}!
Tempo = (n) 10
Pesquisa Sequencial
l Exerccio
l Como torn-la mais rpida?
l 2 verses.
l Qual a complexidade desta pesquisa sequencial
aprimorada?
l Se o elemento procurado for o primeiro?
l Se o elemento procurado for o ltimo?
l E na mdia?
11
Pesquisa Binria
12
Pesquisa Binria
k=8
4 8 15 16 23 42 49 51 62 70
13
Pesquisa Binria
k=8
4 8 15 16 23 42 49 51 62 70
14
Pesquisa Binria
k=8
4 8 15 16 23 42 49 51 62 70
15
Pesquisa Binria
k=8
4 8 15 16 23 42 49 51 62 70
16
Chave encontrada!
Pesquisa Binria - Cdigo
!
! n)!
int PesquisaBinaria( int A[], int k, int
{! !
int esquerda = 0; ! //determina onde comea a busca!
int direita = n-1; ! //determina onde termina a busca!
int meio;! //determina a chave central!
! !
while (esquerda <= direita) ! //enquanto houver mais que !
{! //uma chave no intervalo!
meio = (esquerda+direita)/2;!//calcula a chave central!
! !
! ! if (k == A[meio])! //testa se a central a procurada!
return meio;! !
else if (k < A[meio])! //compara se menor!
direita = meio-1;! !
else! //caso contrrio maior!
esquerda = meio+1;! !
}! !
return -1; ! //retorna -1 se no encontrou!
}!
17
Pesquisa Binria -
Complexidade
l Melhor Caso (1) s
l A chave pesquisada a primeiraTchave
(n) = central: (1);
T (n / 2) + (1) nos ou
l Pior Caso
l A chave procurada no existe no vetor, todas as
divises tero de ser feitas.
18
Teorema Mestre Resumido
k k
l 2. Se a = b ento
O Teorema Mestre estabelece trs casos que T ( n ) ( n log
podem ser simplificados: 3. Se a < b k ento T (n) (n k )
19
Pesquisa Binria -
Complexidade
20
Ordenao
15 23 4 42 8 16
4 8 15 16 23 42
21
Ordenao - Tipos
l Ordenao Interna
l Todas as chaves na memria principal facilidade de
acesso.
l Ordenao externa
l Chaves na memria principal e em memria externa
movimentao de chaves entre as duas.
l Diferentes mtodos para cada tipo.
22
Ordenao - Propriedades
l Estabilidade
l Manuteno da ordem relativa entre chaves de
mesmo valor;
l Especialmente importante para casos em que cada
elemento possui mais de uma chave.
l Adaptabilidade
l Mtodos adaptveis tm o tempo de execuo
reduzido caso a entrada j esteja ordenada.
23
O que importante saber
sobre cada mtodo
l Funcionamento;
l Tipo de ordenao efetuada;
l Complexidade
l Comportamento de acordo com o caso, em termos da
quantidade de chaves.
l Estabilidade;
l Adaptabilidade;
l Especificidades;
24
Mtodos de Ordenao
25
Bubble Sort
(Mtodo Bolha)
l O mtodo mais simples:
l Suponha chaves em um vetor vertical A. Valores
baixos so leves e valores altos so pesados .
Como bolhas, os valores leves sobem no vetor um
por vez, ao passo que os pesados descem.
l Operao Troca(A[i], A[j]): os elementos das
posies i e j trocam de posio.
26
Bubble Sort - Funcionamento
Comparao: 1 e 3
Troca(A[4], A[3])
27
Bubble Sort Procedimento
de Troca
Troca(int *i, int *j) Posio Chave
{ 1 ?
int temp;
temp = *i; 2 2
*i = *j;
3 1
*j = temp;
} 4 3
Comparao: 1 e 2
Troca(A[3], A[2])
28
Bubble Sort - Funcionamento
Comparao: 1 e 4
Troca(A[2], A[1])
29
Bubble Sort - Funcionamento
Comparao: 3 e 2
No h troca.
31
Bubble Sort - Funcionamento
Comparao: 2 e 4
Troca(A[3], A[2])
32
Bubble Sort - Funcionamento
Comparao: 3 e 4
Troca(A[4], A[3])
34
Bubble Sort - Funcionamento
Chaves ordenadas.
35
Bubble Sort - Cdigo
}!
36
Bubble Sort Complexidade
Custo Repeties
!
1 for(i=0; i<n-1; i++)! c1 ! !n!
{! !
2 for(j=n-1; j>i; j--)! c2 !n-i!
3 if(A[j] < A[j-1])! c3 !n-i!
4 Troca(&A[j], &A[j-1]);! !
}! c4 ! !n-i!
37
n n n n
= c1 n + c2 + c3 +
2 2
Bubble Sort Complexidade
c 2 + c3 + c4 2 c1
= n +
2
Tempo = O(n2) 38
Bubble Sort Resumo
39
Insertion Sort
(Mtodo de Insero)
l Analogia com a
organizao de cartas de
baralho na mo;
l Cartas so recebidas e
colocadas na mo
aleatoriamente;
l Durante a organizao,
cada carta colocada no
seu lugar certo, uma por Extrado de Cormen, Leiserson, Rivest, (2001).
vez, deslocando as
demais.
40
Insertion Sort - Funcionamento
l Compara-se os pares de chaves;
l Cada chave colocada na posio correta
l Para isso, outras so movidas.
l Caso j esteja na posio certa, passa-se ao
prximo par.
6 4 ? ? ? ?
41
Insertion Sort - Funcionamento
l Compara-se os pares de chaves;
l Cada chave colocada na posio correta
l Para isso, outras so movidas.
l Caso j esteja na posio certa, passa-se ao
prximo par.
6 ? ? ? ?
4 6 ? ? ? ?
4 6 7 ? ? ?
44
Insertion Sort - Funcionamento
l Compara-se os pares de chaves;
l Cada chave colocada na posio correta
l Para isso, outras so movidas.
l Caso j esteja na posio certa, passa-se ao
prximo par.
4 6 7 5 ? ?
45
Insertion Sort - Funcionamento
l Compara-se os pares de chaves;
l Cada chave colocada na posio correta
l Para isso, outras so movidas.
l Caso j esteja na posio certa, passa-se ao
prximo par.
4 6 7 ? ?
4 5 6 7 ? ?
4 5 6 7 1 ?
48
Insertion Sort - Funcionamento
l Compara-se os pares de chaves;
l Cada chave colocada na posio correta
l Para isso, outras so movidas.
l Caso j esteja na posio certa, passa-se ao
prximo par.
4 5 6 7 ?
1 4 5 6 7 ?
1 4 5 6 7 2
51
Insertion Sort - Funcionamento
l Compara-se os pares de chaves;
l Cada chave colocada na posio correta
l Para isso, outras so movidas.
l Caso j esteja na posio certa, passa-se ao
prximo par.
1 4 5 6 7
1 2 4 5 6 7
54
Insertion Sort - Complexidade
Custo Repeties
55
Insertion
c c cSort
- Complexidade
2 c c c
= + + n + c + c + c + + + + c n (c
4 5 6 4 5 6
+ c3 + c 4 +
1 2 3 7 2
2 2 2 2 2 2
57
Selection Sort
(Mtodo de Seleo)
l Princpio simples;
l A cada iterao procura a chave de menor valor ainda
no ordenada;
l Depois de encontrada, ela inserida na posio correta
do vetor.
58
Selection Sort - Funcionamento
? ? ? ? ?
Menor chave ?
Posio ? 59
Selection Sort - Funcionamento
6 ? ? ? ?
Menor chave 6
Posio 1 60
Selection Sort - Funcionamento
6 4 ? ? ?
Menor chave 4
Posio 2 61
Selection Sort - Funcionamento
6 4 3 ? ?
Menor chave 3
Posio 3 62
Selection Sort - Funcionamento
6 4 3 5 ?
Menor chave 3
Posio 3 63
Selection Sort - Funcionamento
6 4 3 5 1
Menor chave 1
Posio 5 64
Selection Sort - Funcionamento
6 4 3 5
Menor chave 1
Posio 5 65
Selection Sort - Funcionamento
1 6 4 3 5
Menor chave 3
Posio 4
Acelerando 66
Selection Sort - Funcionamento
1 6 4 5
Menor chave 3
Posio 4 67
Selection Sort - Funcionamento
1 3 6 4 5
Menor chave ?
Posio ? 68
Selection Sort - Funcionamento
1 3 6 4 5
Menor chave 4
Posio 4
Acelerando 69
Selection Sort - Funcionamento
1 3 6 5
Menor chave 4
Posio 4 70
Selection Sort - Funcionamento
1 3 4 6 5
Menor chave ?
Posio ? 71
Selection Sort - Funcionamento
1 3 4 6 5
Menor chave 5
Posio 5
Acelerando 72
Selection Sort - Funcionamento
1 3 4 6
Menor chave 5
Posio 5 73
Selection Sort - Funcionamento
1 3 4 5 6
Chaves ordenadas.
74
Selection Sort - Cdigo
75
Selection Sort - Complexidade
Custo Repeties
for(i=0; i<n-1; i++)! c1 ! ! !n!
{! !
MenorChave = A[i];! c2 ! ! !n-1!
! indice = i;! c3 ! ! !n-1!
! !
! for(j=i+1; j<n; j++)! c4 ! ! !n-i!
! {! !
! if(A[j] < MenorChave)! c5 ! ! !n-i !!
! ! {! !
! ! MenorChave = A[j];! c6 ! ! !n-i !!
! ! indice = j;! c7 ! ! !n-i!
! ! }! !
! }! !
! !
! Troca(&A[i], &A[indice]);! c8 ! ! !n-1!
}! !
76
c4 c5 c6 c7 2 c c c c
+ + + n + c1 + c2 + c3 + 4 + 5 + 6 + 7 + c8 n (c2 + c3 +
Selection Sort - Complexidade
2 2 2 2 2 2 2 2
Tempo = O(n2)
77
Selection Sort Resumo
78
Quicksort
79
Quicksort
80
Quicksort - Funcionamento
3 1 ? ? ? ? ? ? ? ?
Piv
Chave 1 permanecer esquerda.
81
Quicksort - Funcionamento
3 1 4 ? ? ? ? ? ? ?
Piv Diviso
Chave 4 permanecer direita.
82
Quicksort - Funcionamento
3 1 4 1 ? ? ? ? ? ?
Piv Diviso
Chave 1 permanecer esquerda.
83
Quicksort - Funcionamento
3 1 1 4 5 ? ? ? ? ?
Piv Diviso
Chave 4 permanecer direita.
84
Quicksort - Funcionamento
3 1 1 4 5 9 ? ? ? ?
Piv Diviso
Chave 9 permanecer direita.
85
Quicksort - Funcionamento
3 1 1 4 5 9 2 ? ? ?
Piv Diviso
Chave 2 permanecer esquerda.
86
Quicksort - Funcionamento
3 1 1 2 5 9 4 6 ? ?
Piv Diviso
Chave 6 permanecer direita.
87
Quicksort - Funcionamento
3 1 1 2 5 9 4 6 5 ?
Piv Diviso
Chave 5 permanecer direita.
88
Quicksort - Funcionamento
3 1 1 2 5 9 4 6 5 3
Piv Diviso
Chave 5 permanecer direita.
89
Quicksort - Funcionamento
3 1 1 2 5 9 4 6 5 3
Piv Diviso
90
Quicksort - Funcionamento
2 1 1 3 5 9 4 6 5 3
91
Quicksort - Funcionamento
2 1 1 1 1 2
Piv
92
Quicksort - Funcionamento
3 1 4 1 5 9 2 6 5 3
2 1 1 3 5 9 4 6 5 3
2 1 1 5 9 4 6 5 3
1 1 2 3 4 5 6 5 9
1 1 3 4 6 5 9
93
1 1 3 4 5 6 9
Quicksort - Cdigo
int Particao(int A[], int esquerda, int direita) !
{! !
int i;! !
int j;! !
! !
i = esquerda;! //varivel de controle!
for(j=esquerda+1; j<=direita; j++) ! //percorre o subvetor!
{! !
if (A[j] < A[esquerda]) ! //se a chave analisada!
! {! //for menor que o piv!
i++;! !
Troca(&A[i], &A[j]);! //troca as chaves de !
}! //posio!
}! !
! !
Troca(&A[esquerda], &A[i]);! //insere o piv na !
! //posio correta!
return i;!
}!
!
94
Quicksort - Cdigo
95
Quicksort - Complexidade
int Particao(int A[], int esquerda, int direita) !
{!
int i;!
int j;! !
! !
i = esquerda;! Custo
!
Repeties
1 for(j=esquerda+1; j<=direita; j++) ! c1 ! ! !n!
{! !
2 if (A[j] < A[esquerda]) ! c2 ! ! !n-1!
! {! !
3 i++;! c3 ! ! !n-1!
4 Troca(&A[i], &A[j]);! c4 ! ! !n-1!
}!
}!
!
Troca(&A[esquerda], &A[i]);!
!
return i;!
}!
!
Tempo = (n)
96
Quicksort - Complexidade
99
Quicksort - Complexidade
100
0
102
Quicksort Resumo
103
Heapsort
104
Heapsort - Heaps 1
16
2 3
14 10
4 5 6 7
8 7 9 3
8 9 10
2 4 1
1 2 3 4 5 6 7 8 9 10
16 14 10 8 7 9 3 2 4 1
105
Heaps
107
Heapsort MAX-HEAPIFY
108
2
4 1
Heapsort MAX-HEAPIFY
4 5 6
14 7 9
8 9 10
2 8 1
109
2 3
10
Heapsort MAX-HEAPIFY
14
4 5 6
4 7 9
8 9 10
2 8 1
110
2 3
10
Heapsort MAX-HEAPIFY
14
4 5 6
8 7 9
8 9 10
2 4 1
111
MAX-HEAPIFY - Cdigo
void MAX_HEAPIFY(int A[], int i, int n){! !!
int esquerdo;! //determina o filho esquerdo!
int direito;! //determina o filho direito!
int maior;! !
!
!
esquerdo = 2*i;! !
direito = 2*i+1;! !
!
if (direito <= n && A[direito] > A //se o direito maior que o maior!
[maior])! !
! maior = direito;! //registra!
!
!
if(maior != i) {! //se o maior no o pai!
Troca(&A[i], &A[maior]);! !
! MAX_HEAPIFY(A, maior, n);! //troca as posies!
}! //verifica se a subrvore viola a !
//propriedade!
}! !
!
! 112
MAX-HEAPIFY - Complexidade
113
Heapsort BUILD-MAX-HEAP
114
1 3
4 5 6
Heapsort BUILD-MAX-HEAP
2 16 9
8 9 10
14 8 7
4 1 3 2 16 9 10 14 8 7
115
1
Heapsort BUILD-MAX-HEAP
4
2 3
1 3
4 5 6
2 16 9
8 9 10
14 8 7
116
1
Heapsort BUILD-MAX-HEAP
4
2 3
1 3
4 5 6
14 16 9
8 9 10
2 8 7
117
1
Heapsort BUILD-MAX-HEAP
4
2 3
1 10
4 5 6
14 16 9
8 9 10
2 8 7
118
1
Heapsort BUILD-MAX-HEAP
4
2 3
16 10
4 5 6
14 7 9
8 9 10
2 8 1
119
1
Heapsort BUILD-MAX-HEAP
16
2 3
14 10
4 5 6
8 7 9
8 9 10
2 4 1
120
BUILD-MAX-HEAP - Cdigo
121
BUILD-MAX-HEAP
Complexidade
l Aparentemente, a complexidade O(nlogn);
l Porm, analisando-se a quantidade mxima de ns
por nvel do heap, e a quantidade de nveis,
possvel provar que a complexidade do
procedimento pode ser limitada por O(n);
l Em outras palavras, construir um heap a partir de
um vetor aleatrio possvel em tempo linear.
122
Heapsort - Funcionamento
8 7 9
2 4 1
124
14
Heapsort - Funcionamento
8 10
4 7 9
i
2 1 16
4 7 1
i
2 14 16
126
9
Heapsort - Funcionamento
8 3
4 7 1
i
10 14 16
127
8
Heapsort - Funcionamento
7 3
4 2 1 9
10 14 16
128
7
Heapsort - Funcionamento
4 3
1 2 8
10 14 16
129
4
Heapsort - Funcionamento
2 3
1 7 8
10 14 16
130
3
Heapsort - Funcionamento
2 1
i
4 7 8
10 14 16
131
2
Heapsort - Funcionamento i
1 3
4 7 8
10 14 16
132
Heapsort - Funcionamento 4 7 8
10 14 16
1 2 3 4 7 8 9 10 14 16
133
Heapsort - Cdigo
!
void HEAPSORT(int A[], int n)!
!
{!
int i;! !
! !
BUILD_MAX_HEAP(A, n-1);! //constri o heap inicial!
! !
for(i=n-1; i>0; i--)! //para cada chave!
{! //coloca a raiz do heap na !
Troca(&A[1], &A[i]);! //posio correta da ordenao!
! MAX_HEAPIFY(A, 1, i-1);! //verifica e corrige a!
}! //propriedade do heap!
}!
134
Heapsort - Complexidade
135
Heapsort - Complexidade
136
Tempo = O(nlogn)
Heapsort Resumo
137
Bucket Sort (Bin Sort)
138
n A[i]
Bucket Sort Funcionamento
139
Bucket Sort Funcionamento
B
0 /
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
140
Bucket Sort Funcionamento
B
0 /
1 /
2 /
3 /
4 /
5 /
6 /
7 0,78 /
8 /
9 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
141
Bucket Sort Funcionamento
B
0 /
1 0,17 /
2 /
3 /
4 /
5 /
6 /
7 0,78 /
8 /
9 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
142
Bucket Sort Funcionamento
B
0 /
1 0,17 /
2 /
3 0,39 /
4 /
5 /
6 /
7 0,78 /
8 /
9 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
143
Bucket Sort Funcionamento
B
0 /
1 0,17 /
2 0,26 /
3 0,39 /
4 /
5 /
6 /
7 0,78 /
8 /
9 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
144
Bucket Sort Funcionamento
B
0 /
1 0,17 /
2 0,26 /
3 0,39 /
4 /
5 /
6 /
7 0,72 0,78 /
8 /
9 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
145
Bucket Sort Funcionamento
B
0 /
1 0,17 /
2 0,26 /
3 0,39 /
4 /
5 /
6 /
7 0,72 0,78 /
8 /
9 0,94 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
146
Bucket Sort Funcionamento
B
0 /
1 0,17 /
2 0,21 0,26 /
3 0,39 /
4 /
5 /
6 /
7 0,72 0,78 /
8 /
9 0,94 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
147
Bucket Sort Funcionamento
B
0 /
1 0,12 0,17 /
2 0,21 0,26 /
3 0,39 /
4 /
5 /
6 /
7 0,72 0,78 /
8 /
9 0,94 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
148
Bucket Sort Funcionamento
B
0 /
1 0,12 0,17 /
3 0,39 /
4 /
5 /
6 /
7 0,72 0,78 /
8 /
9 0,94 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
149
Bucket Sort Funcionamento
B
0 /
1 0,12 0,17 /
3 0,39 /
4 /
5 /
6 0,68 /
7 0,72 0,78 /
8 /
9 0,94 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
150
Bucket Sort Funcionamento
B
0 /
1 0,12 0,17 /
3 0,39 /
4 /
5 /
6 0,68 /
7 0,72 0,78 /
8 /
9 0,94 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
151
Bucket Sort Funcionamento
B
0 /
1 0,12 0,17 /
3 0,39 /
4 /
5 /
6 0,68 /
7 0,72 0,78 /
8 /
9 0,94 /
A 0,78 0,17 0,39 0,26 0,72 0,94 0,21 0,12 0,23 0,68
152
Bucket Sort Pseudo Cdigo
153
Bucket Sort Complexidade
154
Bucket Sort - Complexidade
156
Bucket Sort Resumo
158
Radix Sort
159
Radix Sort - Funcionamento
3 2 9
4 5 7
6 5 7
8 3 9
4 3 6
7 2 0
3 5 5
160
Radix Sort - Funcionamento
3 2 9 7 2 0
4 5 7 3 5 5
6 5 7 4 3 6
8 3 9 4 5 7
4 3 6 6 5 7
7 2 0 3 2 9
3 5 5 8 3 9
161
Radix Sort - Funcionamento
3 2 9 7 2 0
4 5 7 3 5 5
6 5 7 4 3 6
8 3 9 4 5 7
4 3 6 6 5 7
7 2 0 3 2 9
3 5 5 8 3 9
162
Radix Sort - Funcionamento
3 2 9 7 2 0 7 2 0
4 5 7 3 5 5 3 2 9
6 5 7 4 3 6 4 3 6
8 3 9 4 5 7 8 3 9
4 3 6 6 5 7 3 5 5
7 2 0 3 2 9 4 5 7
3 5 5 8 3 9 6 5 7
163
Radix Sort - Funcionamento
3 2 9 7 2 0 7 2 0
4 5 7 3 5 5 3 2 9
6 5 7 4 3 6 4 3 6
8 3 9 4 5 7 8 3 9
4 3 6 6 5 7 3 5 5
7 2 0 3 2 9 4 5 7
3 5 5 8 3 9 6 5 7
164
Radix Sort - Funcionamento
3 2 9 7 2 0 7 2 0 3 2 9
4 5 7 3 5 5 3 2 9 3 5 5
6 5 7 4 3 6 4 3 6 4 3 6
8 3 9 4 5 7 8 3 9 4 5 7
4 3 6 6 5 7 3 5 5 6 5 7
7 2 0 3 2 9 4 5 7 7 2 0
3 5 5 8 3 9 6 5 7 8 3 9
165
Radix Sort Pseudo Cdigo
RadixSort(A[], d)!
{!
for(i=0; i<d; i++)!
BucketSort(A, d);!
}!
l Em que d o dgito em relao ao qual as chaves
sero ordenadas.
166
Radix Sort - Complexidade
167
Radix Sort Resumo
169
Merge Sort
170
Merge Sort - MERGE
A 2 4 5 7 1 2 3 6
p q r
A 2 4 5 7 1 2 3 6
E 2 4 5 7 S D 1 2 3 6 S
A ? ? ? ? ? ? ? ?
E 2 4 5 7 S D 1 2 3 6 S
173
Merge Sort - MERGE
A 1 ? ? ? ? ? ? ?
E 2 4 5 7 S D 1 2 3 6 S
174
Merge Sort - MERGE
A 1 2 ? ? ? ? ? ?
E 2 4 5 7 S D 1 2 3 6 S
175
Merge Sort - MERGE
A 1 2 2 ? ? ? ? ?
E 2 4 5 7 S D 1 2 3 6 S
176
Merge Sort - MERGE
A 1 2 2 3 ? ? ? ?
E 2 4 5 7 S D 1 2 3 6 S
177
Merge Sort - MERGE
A 1 2 2 3 4 ? ? ?
E 2 4 5 7 S D 1 2 3 6 S
178
Merge Sort - MERGE
A 1 2 2 3 4 5 ? ?
E 2 4 5 7 S D 1 2 3 6 S
179
Merge Sort - MERGE
A 1 2 2 3 4 5 6 ?
E 2 4 5 7 S D 1 2 3 6 S
180
Merge Sort - MERGE
l Para que funcione, o vetor original deve ter
subvetores ordenados;
l Para isso, aplica-se recursivamente o algoritmo
l Quando chegar ao ponto deste exemplo, os subvetores estaro
ordenados.
A 1 2 2 3 4 5 6 7
E 2 4 5 7 S D 1 2 3 6 S
181
MERGE - Cdigo
MERGE(int A[], int p, int q, int r)!
{!
n1 = q-p+1;! //define o tamanho dos subvetores !
n2 = r-q;! //esquerdo e direito!
! !
for(i=0; i<n1; i++)! //preenche o subvetor esquerdo!
E[i] = A[p+i];! !
for(i=0; i<n2; i++)! //preenche o subvetor direito!
! D[i] = A[q+i+1];! !
! !
E[n1] = INT_MAX;! //sentinela esquerda!
D[n2] = INT_MAX;! //sentinela direita!
i = j = 0;! !
! !
for(k=p; k<=r; k++)! //Intercala as menores chaves!
if(E[i] <= D[j]) ! {! !
! ! A[k] = E[i]; i++;! !
! }! //e copia para o vetor original!
! else ! {!
! A[k] = D[j]; j++;!
! }!
}!
Exerccio: Alocao dos vetores E e D
dinamicamente, e posterior liberao da memria.
182
MERGE - Complexidade
MERGE(int A[], int p, int q, int r)!
{!
n1 = q-p+1;! !
n2 = r-q;! Custo
! Repeties
! !
for(i=0; i<n1; i++)! c1 ! ! !(n/2)+1!
E[i] = A[p+i];! !
for(i=0; i<n2; i++)! c2 ! ! !(n/2)+1!
! D[i] = A[q+i+1];! !
! !
E[n1] = INT_MAX;! !
D[n2] = INT_MAX;! !
i = j = 0;! !
! !
for(k=p; k<=r; k++)! c3 ! ! !n!
if(E[i] <= D[j]) ! {! !
! ! A[k] = E[i]; i++;! !
! }! !
! else ! {!
! A[k] = D[j]; j++;!
! }!
}!
184
MERGE_SORT
185
MERGE_SORT
186
MERGE_SORT
5 2 4 7
187
MERGE_SORT
5 2 4 7
5 2
Intercala
188
MERGE_SORT
52 25 4 7
5 2
189
MERGE_SORT
52 25 4 7
5 2 4 7
Intercala
190
MERGE_SORT
52 25 4 7
5 2 4 7
191
MERGE_SORT
52 25 4 7
5 2 4 7
Intercala
192
MERGE_SORT
52 25 4 7
5 2 4 7
193
MERGE_SORT
52 25 4 7
5 2 4 7
194
MERGE_SORT
52 25 4 7
5 2 4 7
Intercala
195
MERGE_SORT
52 25 4 7
5 2 4 7
Intercala
196
MERGE_SORT
52 25 4 7
Intercala
5 2 4 7
197
MERGE_SORT
Intercala 52 25 4 7
5 2 4 7
198
MERGE_SORT
52 25 4 7
5 2 4 7
199
MERGE_SORT - Cdigo
!
MERGE_SORT(int A[], int p, int r)!
{!
int q;!
!
if(p < r)!
{!
q = (p+r)/2;!
//dividir!
! MERGE_SORT(A, p, q);!
! MERGE_SORT(A, q+1, r);! //conquistar!
! MERGE(A, p, q, r);! !
}! //combinar!
}!
!
!
!
l Primeira chamada: MERGE_SORT(A, 0, n-1);!
200
Merge Sort - Complexidade
201
Merge Sort - Complexidade
202
Merge Sort - Complexidade
T ( n) =
l Voltando recorrncia, temos ento: T ( n) =
203
Merge Sort Resumo
204