SlideShare uma empresa Scribd logo
ORDENAÇÃO DE ARQUIVOS
Vanessa Braganholo
Estruturas de Dados e Seus
Algoritmos
BUSCA EM ARQUIVO BINÁRIO
Suponha que um banco mantém seus funcionários em um arquivo (mais de 10000
funcionários)
O banco deseja dar um aumento para o funcionário de código 305
Como encontrar o funcionário no arquivo?
INSTITUTO DE COMPUTAÇÃO - UFF 2
ALTERNATIVA 1 – BUSCA SEQUENCIAL
Ler arquivo do início até encontrar o funcionário
­ Muito custoso
­ No pior caso (funcionário não existe ou é o último), lê o arquivo inteiro
INSTITUTO DE COMPUTAÇÃO - UFF 3
BUSCA SEQUENCIAL POR FUNCIONÁRIO 305
Código Nome Salário
102 Joao Silva 1000
123 Carlos Albuquerque 1500
143 Ana Bueno 1500
200 Caio Gusmao 4000
239 Bianca Amarilo 3000
254 Arnaldo Souza 4300
305 Marisa Clara 5000
403 Bruno Simao 4500
410 Guilherme Santos 2000
502 Tatiana Andrade 2500
INSTITUTO DE COMPUTAÇÃO - UFF 4
BUSCA SEQUENCIAL POR FUNCIONÁRIO 305
Código Nome Salário
102 Joao Silva 1000
123 Carlos Albuquerque 1500
143 Ana Bueno 1500
200 Caio Gusmao 4000
239 Bianca Amarilo 3000
254 Arnaldo Souza 4300
305 Marisa Clara 5000
403 Bruno Simao 4500
410 Guilherme Santos 2000
502 Tatiana Andrade 2500
INSTITUTO DE COMPUTAÇÃO - UFF 5
BUSCA SEQUENCIAL POR FUNCIONÁRIO 305
Código Nome Salário
102 Joao Silva 1000
123 Carlos Albuquerque 1500
143 Ana Bueno 1500
200 Caio Gusmao 4000
239 Bianca Amarilo 3000
254 Arnaldo Souza 4300
305 Marisa Clara 5000
403 Bruno Simao 4500
410 Guilherme Santos 2000
502 Tatiana Andrade 2500
INSTITUTO DE COMPUTAÇÃO - UFF 6
BUSCA SEQUENCIAL POR FUNCIONÁRIO 305
Código Nome Salário
102 Joao Silva 1000
123 Carlos Albuquerque 1500
143 Ana Bueno 1500
200 Caio Gusmao 4000
239 Bianca Amarilo 3000
254 Arnaldo Souza 4300
305 Marisa Clara 5000
403 Bruno Simao 4500
410 Guilherme Santos 2000
502 Tatiana Andrade 2500
INSTITUTO DE COMPUTAÇÃO - UFF 7
BUSCA SEQUENCIAL POR FUNCIONÁRIO 305
Código Nome Salário
102 Joao Silva 1000
123 Carlos Albuquerque 1500
143 Ana Bueno 1500
200 Caio Gusmao 4000
239 Bianca Amarilo 3000
254 Arnaldo Souza 4300
305 Marisa Clara 5000
403 Bruno Simao 4500
410 Guilherme Santos 2000
502 Tatiana Andrade 2500
INSTITUTO DE COMPUTAÇÃO - UFF 8
BUSCA SEQUENCIAL POR FUNCIONÁRIO 305
Código Nome Salário
102 Joao Silva 1000
123 Carlos Albuquerque 1500
143 Ana Bueno 1500
200 Caio Gusmao 4000
239 Bianca Amarilo 3000
254 Arnaldo Souza 4300
305 Marisa Clara 5000
403 Bruno Simao 4500
410 Guilherme Santos 2000
502 Tatiana Andrade 2500
INSTITUTO DE COMPUTAÇÃO - UFF 9
BUSCA SEQUENCIAL POR FUNCIONÁRIO 305
Código Nome Salário
102 Joao Silva 1000
123 Carlos Albuquerque 1500
143 Ana Bueno 1500
200 Caio Gusmao 4000
239 Bianca Amarilo 3000
254 Arnaldo Souza 4300
305 Marisa Clara 5000
403 Bruno Simao 4500
410 Guilherme Santos 2000
502 Tatiana Andrade 2500
INSTITUTO DE COMPUTAÇÃO - UFF 10
ALTERNATIVA 2
Se arquivo está ordenado, faz busca binária
INSTITUTO DE COMPUTAÇÃO - UFF 11
BUSCA BINÁRIA POR FUNCIONÁRIO 305
Código Nome Salário
1 102 Joao Silva 1000
2 123 Carlos Albuquerque 1500
3 143 Ana Bueno 1500
4 200 Caio Gusmao 4000
5 239 Bianca Amarilo 3000
6 254 Arnaldo Souza 4300
7 305 Marisa Clara 5000
8 403 Bruno Simao 4500
9 410 Guilherme Santos 2000
10 502 Tatiana Andrade 2500
INSTITUTO DE COMPUTAÇÃO - UFF 12
Lê registro do meio e compara
chave buscada com a chave do
registro lido
início = 1
fim = 10
meio = trunc((inicio + fim)/2) = 5
305 > 239
BUSCA BINÁRIA POR FUNCIONÁRIO 305
INSTITUTO DE COMPUTAÇÃO - UFF 13
Repete procedimento na metade
do arquivo correspondente (se
chave menor, na metade de cima,
se chave maior, na metade de
baixo)
início = meio + 1
Código Nome Salário
1 102 Joao Silva 1000
2 123 Carlos Albuquerque 1500
3 143 Ana Bueno 1500
4 200 Caio Gusmao 4000
5 239 Bianca Amarilo 3000
6 254 Arnaldo Souza 4300
7 305 Marisa Clara 5000
8 403 Bruno Simao 4500
9 410 Guilherme Santos 2000
10 502 Tatiana Andrade 2500
BUSCA BINÁRIA POR FUNCIONÁRIO 305
INSTITUTO DE COMPUTAÇÃO - UFF 14
Lê registro do meio e compara
chave buscada com a chave do
registro lido
início = 6
fim = 10
meio = trunc((inicio + fim)/2) = 8
305 < 403
Código Nome Salário
1 102 Joao Silva 1000
2 123 Carlos Albuquerque 1500
3 143 Ana Bueno 1500
4 200 Caio Gusmao 4000
5 239 Bianca Amarilo 3000
6 254 Arnaldo Souza 4300
7 305 Marisa Clara 5000
8 403 Bruno Simao 4500
9 410 Guilherme Santos 2000
10 502 Tatiana Andrade 2500
BUSCA BINÁRIA POR FUNCIONÁRIO 305
INSTITUTO DE COMPUTAÇÃO - UFF 15
Repete procedimento na metade
do arquivo correspondente (se
chave menor, na metade de cima,
se chave maior, na metade de
baixo)
fim = meio - 1
Código Nome Salário
1 102 Joao Silva 1000
2 123 Carlos Albuquerque 1500
3 143 Ana Bueno 1500
4 200 Caio Gusmao 4000
5 239 Bianca Amarilo 3000
6 254 Arnaldo Souza 4300
7 305 Marisa Clara 5000
8 403 Bruno Simao 4500
9 410 Guilherme Santos 2000
10 502 Tatiana Andrade 2500
BUSCA BINÁRIA POR FUNCIONÁRIO 305
INSTITUTO DE COMPUTAÇÃO - UFF 16
Lê registro do meio e compara
chave buscada com a chave do
registro lido
início = 6
fim = 7
meio = trunc((inicio + fim)/2) = 6
305 > 254
Código Nome Salário
1 102 Joao Silva 1000
2 123 Carlos Albuquerque 1500
3 143 Ana Bueno 1500
4 200 Caio Gusmao 4000
5 239 Bianca Amarilo 3000
6 254 Arnaldo Souza 4300
7 305 Marisa Clara 5000
8 403 Bruno Simao 4500
9 410 Guilherme Santos 2000
10 502 Tatiana Andrade 2500
BUSCA BINÁRIA POR FUNCIONÁRIO 305
INSTITUTO DE COMPUTAÇÃO - UFF 17
Repete procedimento na metade
do arquivo correspondente (se
chave menor, na metade de cima,
se chave maior, na metade de
baixo)
inicio = meio + 1
Código Nome Salário
1 102 Joao Silva 1000
2 123 Carlos Albuquerque 1500
3 143 Ana Bueno 1500
4 200 Caio Gusmao 4000
5 239 Bianca Amarilo 3000
6 254 Arnaldo Souza 4300
7 305 Marisa Clara 5000
8 403 Bruno Simao 4500
9 410 Guilherme Santos 2000
10 502 Tatiana Andrade 2500
Código Nome Salário
1 102 Joao Silva 1000
2 123 Carlos Albuquerque 1500
3 143 Ana Bueno 1500
4 200 Caio Gusmao 4000
5 239 Bianca Amarilo 3000
6 254 Arnaldo Souza 4300
7 305 Marisa Clara 5000
8 403 Bruno Simao 4500
9 410 Guilherme Santos 2000
10 502 Tatiana Andrade 2500
BUSCA BINÁRIA POR FUNCIONÁRIO 305
INSTITUTO DE COMPUTAÇÃO - UFF 18
Lê registro do meio e compara
chave buscada com a chave do
registro lido
início = 7
fim = 7
meio = trunc((inicio + fim)/2) = 7
305 = 305
BUSCA BINÁRIA – DETALHES
Exige que se saiba o endereço de um determinado registro, para que seja possível
fazer o seek no arquivo para aquele endereço
­ Usar cálculo de endereço visto anteriormente
Exige que se saiba quantos registros o arquivo possui
­ Usar função tamanho_arquivo vista anteriormente
INSTITUTO DE COMPUTAÇÃO - UFF 19
COMPARAÇÃO
Na busca sequencial, para esse exemplo, foram lidos 7 registros até encontrar o
funcionário desejado
Na busca binária, foram lidos apenas 4 registros
Assumindo que o arquivo tem n registros:
­ Complexidade da busca sequencial: O(n)
­ Complexidade da busca binária: O(log n)
INSTITUTO DE COMPUTAÇÃO - UFF 20
EXERCÍCIO
Dado um arquivo de funcionários, ordenado, implementar uma função que faz busca
binária no arquivo
/* cod é a chave buscada
* *arq é o ponteiro para o arquivo
* tam é o número de registros do arquivo
*/
TFunc *busca_binaria(int cod, FILE *arq, int tam)
INSTITUTO DE COMPUTAÇÃO - UFF 21
ORDENAÇÃO
INSTITUTO DE COMPUTAÇÃO - UFF 22
ORDENAÇÃO
Busca binária exige que arquivo esteja ordenado
Como ordenar um arquivo?
INSTITUTO DE COMPUTAÇÃO - UFF 23
MÉTODOS DE ORDENAÇÃO DE ARQUIVOS
Vários métodos podem ser aplicados
Possível solução:
­ métodos de ordenação em memória
1. Ler arquivo e armazenar os dados num array em memória
2. Ordenar o array
3. Gravar novo arquivo com os dados ordenados
CONVENÇÃO
Os algoritmos que veremos assumem que todas as chaves do arquivo estão num
vetor A
Na prática isso será algo como A[i].chave
ORDENAÇÃO POR INSERÇÃO
Insertion Sort
Nome do método se deve ao fato de que no i-ésimo passo ele insere o i-ésimo
elemento A[i] na posição correta entre A[1], A[2], …, A[i-1] que já foram
previamente ordenados
FUNCIONAMENTO DO INSERTION SORT
1. Assume que o primeiro valor já está ordenado
2. Pega o próximo valor, compara com os anteriores até descobrir em que posição
ele deveria estar
3. Abre espaço no vetor para encaixar o valor na posição correta
4. Encaixa o valor na posição correta
5. Se vetor ainda não terminou, volta para o passo 2
FUNCIONAMENTO DO INSERTION SORT
1. Assume que o primeiro valor já está ordenado
2. Pega o próximo valor, compara com os anteriores até descobrir em que
posição ele deveria estar
3. Abre espaço no vetor para encaixar o valor na posição correta
4. Encaixa o valor na posição correta
5. Se vetor ainda não terminou, volta para o passo 2
300 200 215 201
A
FUNCIONAMENTO DO INSERTION SORT
1. Assume que o primeiro valor já está ordenado
2. Pega o próximo valor, compara com os anteriores até descobrir em que posição
ele deveria estar
3. Abre espaço no vetor para encaixar o valor na posição correta
4. Encaixa o valor na posição correta
5. Se vetor ainda não terminou, volta para o passo 2
300 215 201
A
FUNCIONAMENTO DO INSERTION SORT
1. Assume que o primeiro valor já está ordenado
2. Pega o próximo valor, compara com os anteriores até descobrir em que posição
ele deveria estar
3. Abre espaço no vetor para encaixar o valor na posição correta
4. Encaixa o valor na posição correta
5. Se vetor ainda não terminou, volta para o passo 2
200 300 215 201
A
FUNCIONAMENTO DO INSERTION SORT
1. Assume que o primeiro valor já está ordenado
2. Pega o próximo valor, compara com os anteriores até descobrir em que
posição ele deveria estar
3. Abre espaço no vetor para encaixar o valor na posição correta
4. Encaixa o valor na posição correta
5. Se vetor ainda não terminou, volta para o passo 2
200 300 215 201
A
FUNCIONAMENTO DO INSERTION SORT
1. Assume que o primeiro valor já está ordenado
2. Pega o próximo valor, compara com os anteriores até descobrir em que posição
ele deveria estar
3. Abre espaço no vetor para encaixar o valor na posição correta
4. Encaixa o valor na posição correta
5. Se vetor ainda não terminou, volta para o passo 2
200 300 201
A
FUNCIONAMENTO DO INSERTION SORT
1. Assume que o primeiro valor já está ordenado
2. Pega o próximo valor, compara com os anteriores até descobrir em que posição
ele deveria estar
3. Abre espaço no vetor para encaixar o valor na posição correta
4. Encaixa o valor na posição correta
5. Se vetor ainda não terminou, volta para o passo 2
200 215 300 201
A
FUNCIONAMENTO DO INSERTION SORT
1. Assume que o primeiro valor já está ordenado
2. Pega o próximo valor, compara com os anteriores até descobrir em que
posição ele deveria estar
3. Abre espaço no vetor para encaixar o valor na posição correta
4. Encaixa o valor na posição correta
5. Se vetor ainda não terminou, volta para o passo 2
200 215 300 201
A
FUNCIONAMENTO DO INSERTION SORT
1. Assume que o primeiro valor já está ordenado
2. Pega o próximo valor, compara com os anteriores até descobrir em que posição
ele deveria estar
3. Abre espaço no vetor para encaixar o valor na posição correta
4. Encaixa o valor na posição correta
5. Se vetor ainda não terminou, volta para o passo 2
200 215 300
A
FUNCIONAMENTO DO INSERTION SORT
1. Assume que o primeiro valor já está ordenado
2. Pega o próximo valor, compara com os anteriores até descobrir em que posição
ele deveria estar
3. Abre espaço no vetor para encaixar o valor na posição correta
4. Encaixa o valor na posição correta
5. Se vetor ainda não terminou, volta para o passo 2
200 201 215 300
A
ALGORITMO INSERTION SORT
procedure insertionSort(A: array, size: int) {
//ENTRADA: A: array com as chaves (posições vão de [0, tam-1]);
// size: tamanho do array
//SAÍDA: A: array ordenado
for j := 1 to size-1 do {
key := A[j];
i := j – 1;
while (i >= 0) and (A[i] > key) do {
A[i+1] := A[i];
i := i –1;
}
A[i+1] := key
}
INSERTION SORT PARA ORDENAR FUNCIONÁRIOS
USANDO VETOR EM MEMÓRIA
Ver código no site da disciplina
INSTITUTO DE COMPUTAÇÃO - UFF 38
COMPLEXIDADE DO INSERTION SORT
Complexidade pior caso O(n2)
Complexidade caso médio O(n2)
Complexidade melhor caso O(n)
Complexidade de espaço O(n)
OUTROS ALGORITMOS DE ORDENAÇÃO
Selection Sort
Buble Sort
Quick Sort
...
INSTITUTO DE COMPUTAÇÃO - UFF 40
ORDENAÇÃO DE ARQUIVOS
Qualquer algoritmo de ordenação pode ser usado para ordenar arquivos, desde
que:
­ os registros caibam todos na memória de uma só vez
Alternativa que gasta menos memória:
­ Fazer a ordenação direto no arquivo, sem usar um vetor auxiliar
­ Só pode ser feito para arquivos binários, pois é necessário usar seek para se deslocar de um registro
a outro
INSTITUTO DE COMPUTAÇÃO - UFF 41
INSERTION SORT DIRETO NO ARQUIVO
Ver código no site da disciplina
INSTITUTO DE COMPUTAÇÃO - UFF 42
EXERCÍCIO
Implementar uma função que faz o Selection Sort direto no arquivo, sem usar um
vetor auxiliar
void selection_sort_disco(FILE *arq, int tam)
Lembrete: o Selecion Sort percorre o arquivo, procurando o menor elemento. Quando
encontra, coloca-o na posição 1 (troca o elemento da posição 1 por ele). Depois,
procura o próximo menor. Quando encontra, coloca-o na posição 2 (troca o elemento
menor pelo da posição 2), e assim por diante.
INSTITUTO DE COMPUTAÇÃO - UFF 43
REFERÊNCIA
Schildt, H. C Completo e Total. Ed. McGraw-Hill
INSTITUTO DE COMPUTAÇÃO - UFF 44

Mais conteúdo relacionado

Mais de Ademar Trindade

AULA_INTRODUÇÃO_PARTE_0.pptx
AULA_INTRODUÇÃO_PARTE_0.pptxAULA_INTRODUÇÃO_PARTE_0.pptx
AULA_INTRODUÇÃO_PARTE_0.pptx
Ademar Trindade
 
TCC Tiago Barreto de Lima.pdf
TCC Tiago Barreto de Lima.pdfTCC Tiago Barreto de Lima.pdf
TCC Tiago Barreto de Lima.pdf
Ademar Trindade
 
Simulando infraestruturas-computacionais-para-a-ubicomp
Simulando infraestruturas-computacionais-para-a-ubicompSimulando infraestruturas-computacionais-para-a-ubicomp
Simulando infraestruturas-computacionais-para-a-ubicomp
Ademar Trindade
 
Isa madapt tese
Isa madapt teseIsa madapt tese
Isa madapt tese
Ademar Trindade
 
Internet das-coisas
Internet das-coisasInternet das-coisas
Internet das-coisas
Ademar Trindade
 
Artigo ihc1
Artigo ihc1Artigo ihc1
Artigo ihc1
Ademar Trindade
 
63924715 xxi-simposio-brasileiro-de-redes-de-computadores
63924715 xxi-simposio-brasileiro-de-redes-de-computadores63924715 xxi-simposio-brasileiro-de-redes-de-computadores
63924715 xxi-simposio-brasileiro-de-redes-de-computadores
Ademar Trindade
 
4452
44524452
2007 alexandre rodriguesgomes
2007 alexandre rodriguesgomes2007 alexandre rodriguesgomes
2007 alexandre rodriguesgomes
Ademar Trindade
 
926 4624-1-pb
926 4624-1-pb926 4624-1-pb
926 4624-1-pb
Ademar Trindade
 
45
4545
170557670 pesquisa-e-ordenacao
170557670 pesquisa-e-ordenacao170557670 pesquisa-e-ordenacao
170557670 pesquisa-e-ordenacao
Ademar Trindade
 
7082 texto do artigo-33807-2-10-20180903
7082 texto do artigo-33807-2-10-201809037082 texto do artigo-33807-2-10-20180903
7082 texto do artigo-33807-2-10-20180903
Ademar Trindade
 
00011
0001100011
000003 complexidade
000003 complexidade000003 complexidade
000003 complexidade
Ademar Trindade
 
01
0101
0001
00010001
000
000000
Top0
Top0Top0
Usar explicação 01
Usar explicação 01Usar explicação 01
Usar explicação 01
Ademar Trindade
 

Mais de Ademar Trindade (20)

AULA_INTRODUÇÃO_PARTE_0.pptx
AULA_INTRODUÇÃO_PARTE_0.pptxAULA_INTRODUÇÃO_PARTE_0.pptx
AULA_INTRODUÇÃO_PARTE_0.pptx
 
TCC Tiago Barreto de Lima.pdf
TCC Tiago Barreto de Lima.pdfTCC Tiago Barreto de Lima.pdf
TCC Tiago Barreto de Lima.pdf
 
Simulando infraestruturas-computacionais-para-a-ubicomp
Simulando infraestruturas-computacionais-para-a-ubicompSimulando infraestruturas-computacionais-para-a-ubicomp
Simulando infraestruturas-computacionais-para-a-ubicomp
 
Isa madapt tese
Isa madapt teseIsa madapt tese
Isa madapt tese
 
Internet das-coisas
Internet das-coisasInternet das-coisas
Internet das-coisas
 
Artigo ihc1
Artigo ihc1Artigo ihc1
Artigo ihc1
 
63924715 xxi-simposio-brasileiro-de-redes-de-computadores
63924715 xxi-simposio-brasileiro-de-redes-de-computadores63924715 xxi-simposio-brasileiro-de-redes-de-computadores
63924715 xxi-simposio-brasileiro-de-redes-de-computadores
 
4452
44524452
4452
 
2007 alexandre rodriguesgomes
2007 alexandre rodriguesgomes2007 alexandre rodriguesgomes
2007 alexandre rodriguesgomes
 
926 4624-1-pb
926 4624-1-pb926 4624-1-pb
926 4624-1-pb
 
45
4545
45
 
170557670 pesquisa-e-ordenacao
170557670 pesquisa-e-ordenacao170557670 pesquisa-e-ordenacao
170557670 pesquisa-e-ordenacao
 
7082 texto do artigo-33807-2-10-20180903
7082 texto do artigo-33807-2-10-201809037082 texto do artigo-33807-2-10-20180903
7082 texto do artigo-33807-2-10-20180903
 
00011
0001100011
00011
 
000003 complexidade
000003 complexidade000003 complexidade
000003 complexidade
 
01
0101
01
 
0001
00010001
0001
 
000
000000
000
 
Top0
Top0Top0
Top0
 
Usar explicação 01
Usar explicação 01Usar explicação 01
Usar explicação 01
 

08 ordenacao

  • 1. ORDENAÇÃO DE ARQUIVOS Vanessa Braganholo Estruturas de Dados e Seus Algoritmos
  • 2. BUSCA EM ARQUIVO BINÁRIO Suponha que um banco mantém seus funcionários em um arquivo (mais de 10000 funcionários) O banco deseja dar um aumento para o funcionário de código 305 Como encontrar o funcionário no arquivo? INSTITUTO DE COMPUTAÇÃO - UFF 2
  • 3. ALTERNATIVA 1 – BUSCA SEQUENCIAL Ler arquivo do início até encontrar o funcionário ­ Muito custoso ­ No pior caso (funcionário não existe ou é o último), lê o arquivo inteiro INSTITUTO DE COMPUTAÇÃO - UFF 3
  • 4. BUSCA SEQUENCIAL POR FUNCIONÁRIO 305 Código Nome Salário 102 Joao Silva 1000 123 Carlos Albuquerque 1500 143 Ana Bueno 1500 200 Caio Gusmao 4000 239 Bianca Amarilo 3000 254 Arnaldo Souza 4300 305 Marisa Clara 5000 403 Bruno Simao 4500 410 Guilherme Santos 2000 502 Tatiana Andrade 2500 INSTITUTO DE COMPUTAÇÃO - UFF 4
  • 5. BUSCA SEQUENCIAL POR FUNCIONÁRIO 305 Código Nome Salário 102 Joao Silva 1000 123 Carlos Albuquerque 1500 143 Ana Bueno 1500 200 Caio Gusmao 4000 239 Bianca Amarilo 3000 254 Arnaldo Souza 4300 305 Marisa Clara 5000 403 Bruno Simao 4500 410 Guilherme Santos 2000 502 Tatiana Andrade 2500 INSTITUTO DE COMPUTAÇÃO - UFF 5
  • 6. BUSCA SEQUENCIAL POR FUNCIONÁRIO 305 Código Nome Salário 102 Joao Silva 1000 123 Carlos Albuquerque 1500 143 Ana Bueno 1500 200 Caio Gusmao 4000 239 Bianca Amarilo 3000 254 Arnaldo Souza 4300 305 Marisa Clara 5000 403 Bruno Simao 4500 410 Guilherme Santos 2000 502 Tatiana Andrade 2500 INSTITUTO DE COMPUTAÇÃO - UFF 6
  • 7. BUSCA SEQUENCIAL POR FUNCIONÁRIO 305 Código Nome Salário 102 Joao Silva 1000 123 Carlos Albuquerque 1500 143 Ana Bueno 1500 200 Caio Gusmao 4000 239 Bianca Amarilo 3000 254 Arnaldo Souza 4300 305 Marisa Clara 5000 403 Bruno Simao 4500 410 Guilherme Santos 2000 502 Tatiana Andrade 2500 INSTITUTO DE COMPUTAÇÃO - UFF 7
  • 8. BUSCA SEQUENCIAL POR FUNCIONÁRIO 305 Código Nome Salário 102 Joao Silva 1000 123 Carlos Albuquerque 1500 143 Ana Bueno 1500 200 Caio Gusmao 4000 239 Bianca Amarilo 3000 254 Arnaldo Souza 4300 305 Marisa Clara 5000 403 Bruno Simao 4500 410 Guilherme Santos 2000 502 Tatiana Andrade 2500 INSTITUTO DE COMPUTAÇÃO - UFF 8
  • 9. BUSCA SEQUENCIAL POR FUNCIONÁRIO 305 Código Nome Salário 102 Joao Silva 1000 123 Carlos Albuquerque 1500 143 Ana Bueno 1500 200 Caio Gusmao 4000 239 Bianca Amarilo 3000 254 Arnaldo Souza 4300 305 Marisa Clara 5000 403 Bruno Simao 4500 410 Guilherme Santos 2000 502 Tatiana Andrade 2500 INSTITUTO DE COMPUTAÇÃO - UFF 9
  • 10. BUSCA SEQUENCIAL POR FUNCIONÁRIO 305 Código Nome Salário 102 Joao Silva 1000 123 Carlos Albuquerque 1500 143 Ana Bueno 1500 200 Caio Gusmao 4000 239 Bianca Amarilo 3000 254 Arnaldo Souza 4300 305 Marisa Clara 5000 403 Bruno Simao 4500 410 Guilherme Santos 2000 502 Tatiana Andrade 2500 INSTITUTO DE COMPUTAÇÃO - UFF 10
  • 11. ALTERNATIVA 2 Se arquivo está ordenado, faz busca binária INSTITUTO DE COMPUTAÇÃO - UFF 11
  • 12. BUSCA BINÁRIA POR FUNCIONÁRIO 305 Código Nome Salário 1 102 Joao Silva 1000 2 123 Carlos Albuquerque 1500 3 143 Ana Bueno 1500 4 200 Caio Gusmao 4000 5 239 Bianca Amarilo 3000 6 254 Arnaldo Souza 4300 7 305 Marisa Clara 5000 8 403 Bruno Simao 4500 9 410 Guilherme Santos 2000 10 502 Tatiana Andrade 2500 INSTITUTO DE COMPUTAÇÃO - UFF 12 Lê registro do meio e compara chave buscada com a chave do registro lido início = 1 fim = 10 meio = trunc((inicio + fim)/2) = 5 305 > 239
  • 13. BUSCA BINÁRIA POR FUNCIONÁRIO 305 INSTITUTO DE COMPUTAÇÃO - UFF 13 Repete procedimento na metade do arquivo correspondente (se chave menor, na metade de cima, se chave maior, na metade de baixo) início = meio + 1 Código Nome Salário 1 102 Joao Silva 1000 2 123 Carlos Albuquerque 1500 3 143 Ana Bueno 1500 4 200 Caio Gusmao 4000 5 239 Bianca Amarilo 3000 6 254 Arnaldo Souza 4300 7 305 Marisa Clara 5000 8 403 Bruno Simao 4500 9 410 Guilherme Santos 2000 10 502 Tatiana Andrade 2500
  • 14. BUSCA BINÁRIA POR FUNCIONÁRIO 305 INSTITUTO DE COMPUTAÇÃO - UFF 14 Lê registro do meio e compara chave buscada com a chave do registro lido início = 6 fim = 10 meio = trunc((inicio + fim)/2) = 8 305 < 403 Código Nome Salário 1 102 Joao Silva 1000 2 123 Carlos Albuquerque 1500 3 143 Ana Bueno 1500 4 200 Caio Gusmao 4000 5 239 Bianca Amarilo 3000 6 254 Arnaldo Souza 4300 7 305 Marisa Clara 5000 8 403 Bruno Simao 4500 9 410 Guilherme Santos 2000 10 502 Tatiana Andrade 2500
  • 15. BUSCA BINÁRIA POR FUNCIONÁRIO 305 INSTITUTO DE COMPUTAÇÃO - UFF 15 Repete procedimento na metade do arquivo correspondente (se chave menor, na metade de cima, se chave maior, na metade de baixo) fim = meio - 1 Código Nome Salário 1 102 Joao Silva 1000 2 123 Carlos Albuquerque 1500 3 143 Ana Bueno 1500 4 200 Caio Gusmao 4000 5 239 Bianca Amarilo 3000 6 254 Arnaldo Souza 4300 7 305 Marisa Clara 5000 8 403 Bruno Simao 4500 9 410 Guilherme Santos 2000 10 502 Tatiana Andrade 2500
  • 16. BUSCA BINÁRIA POR FUNCIONÁRIO 305 INSTITUTO DE COMPUTAÇÃO - UFF 16 Lê registro do meio e compara chave buscada com a chave do registro lido início = 6 fim = 7 meio = trunc((inicio + fim)/2) = 6 305 > 254 Código Nome Salário 1 102 Joao Silva 1000 2 123 Carlos Albuquerque 1500 3 143 Ana Bueno 1500 4 200 Caio Gusmao 4000 5 239 Bianca Amarilo 3000 6 254 Arnaldo Souza 4300 7 305 Marisa Clara 5000 8 403 Bruno Simao 4500 9 410 Guilherme Santos 2000 10 502 Tatiana Andrade 2500
  • 17. BUSCA BINÁRIA POR FUNCIONÁRIO 305 INSTITUTO DE COMPUTAÇÃO - UFF 17 Repete procedimento na metade do arquivo correspondente (se chave menor, na metade de cima, se chave maior, na metade de baixo) inicio = meio + 1 Código Nome Salário 1 102 Joao Silva 1000 2 123 Carlos Albuquerque 1500 3 143 Ana Bueno 1500 4 200 Caio Gusmao 4000 5 239 Bianca Amarilo 3000 6 254 Arnaldo Souza 4300 7 305 Marisa Clara 5000 8 403 Bruno Simao 4500 9 410 Guilherme Santos 2000 10 502 Tatiana Andrade 2500
  • 18. Código Nome Salário 1 102 Joao Silva 1000 2 123 Carlos Albuquerque 1500 3 143 Ana Bueno 1500 4 200 Caio Gusmao 4000 5 239 Bianca Amarilo 3000 6 254 Arnaldo Souza 4300 7 305 Marisa Clara 5000 8 403 Bruno Simao 4500 9 410 Guilherme Santos 2000 10 502 Tatiana Andrade 2500 BUSCA BINÁRIA POR FUNCIONÁRIO 305 INSTITUTO DE COMPUTAÇÃO - UFF 18 Lê registro do meio e compara chave buscada com a chave do registro lido início = 7 fim = 7 meio = trunc((inicio + fim)/2) = 7 305 = 305
  • 19. BUSCA BINÁRIA – DETALHES Exige que se saiba o endereço de um determinado registro, para que seja possível fazer o seek no arquivo para aquele endereço ­ Usar cálculo de endereço visto anteriormente Exige que se saiba quantos registros o arquivo possui ­ Usar função tamanho_arquivo vista anteriormente INSTITUTO DE COMPUTAÇÃO - UFF 19
  • 20. COMPARAÇÃO Na busca sequencial, para esse exemplo, foram lidos 7 registros até encontrar o funcionário desejado Na busca binária, foram lidos apenas 4 registros Assumindo que o arquivo tem n registros: ­ Complexidade da busca sequencial: O(n) ­ Complexidade da busca binária: O(log n) INSTITUTO DE COMPUTAÇÃO - UFF 20
  • 21. EXERCÍCIO Dado um arquivo de funcionários, ordenado, implementar uma função que faz busca binária no arquivo /* cod é a chave buscada * *arq é o ponteiro para o arquivo * tam é o número de registros do arquivo */ TFunc *busca_binaria(int cod, FILE *arq, int tam) INSTITUTO DE COMPUTAÇÃO - UFF 21
  • 23. ORDENAÇÃO Busca binária exige que arquivo esteja ordenado Como ordenar um arquivo? INSTITUTO DE COMPUTAÇÃO - UFF 23
  • 24. MÉTODOS DE ORDENAÇÃO DE ARQUIVOS Vários métodos podem ser aplicados Possível solução: ­ métodos de ordenação em memória 1. Ler arquivo e armazenar os dados num array em memória 2. Ordenar o array 3. Gravar novo arquivo com os dados ordenados
  • 25. CONVENÇÃO Os algoritmos que veremos assumem que todas as chaves do arquivo estão num vetor A Na prática isso será algo como A[i].chave
  • 26. ORDENAÇÃO POR INSERÇÃO Insertion Sort Nome do método se deve ao fato de que no i-ésimo passo ele insere o i-ésimo elemento A[i] na posição correta entre A[1], A[2], …, A[i-1] que já foram previamente ordenados
  • 27. FUNCIONAMENTO DO INSERTION SORT 1. Assume que o primeiro valor já está ordenado 2. Pega o próximo valor, compara com os anteriores até descobrir em que posição ele deveria estar 3. Abre espaço no vetor para encaixar o valor na posição correta 4. Encaixa o valor na posição correta 5. Se vetor ainda não terminou, volta para o passo 2
  • 28. FUNCIONAMENTO DO INSERTION SORT 1. Assume que o primeiro valor já está ordenado 2. Pega o próximo valor, compara com os anteriores até descobrir em que posição ele deveria estar 3. Abre espaço no vetor para encaixar o valor na posição correta 4. Encaixa o valor na posição correta 5. Se vetor ainda não terminou, volta para o passo 2 300 200 215 201 A
  • 29. FUNCIONAMENTO DO INSERTION SORT 1. Assume que o primeiro valor já está ordenado 2. Pega o próximo valor, compara com os anteriores até descobrir em que posição ele deveria estar 3. Abre espaço no vetor para encaixar o valor na posição correta 4. Encaixa o valor na posição correta 5. Se vetor ainda não terminou, volta para o passo 2 300 215 201 A
  • 30. FUNCIONAMENTO DO INSERTION SORT 1. Assume que o primeiro valor já está ordenado 2. Pega o próximo valor, compara com os anteriores até descobrir em que posição ele deveria estar 3. Abre espaço no vetor para encaixar o valor na posição correta 4. Encaixa o valor na posição correta 5. Se vetor ainda não terminou, volta para o passo 2 200 300 215 201 A
  • 31. FUNCIONAMENTO DO INSERTION SORT 1. Assume que o primeiro valor já está ordenado 2. Pega o próximo valor, compara com os anteriores até descobrir em que posição ele deveria estar 3. Abre espaço no vetor para encaixar o valor na posição correta 4. Encaixa o valor na posição correta 5. Se vetor ainda não terminou, volta para o passo 2 200 300 215 201 A
  • 32. FUNCIONAMENTO DO INSERTION SORT 1. Assume que o primeiro valor já está ordenado 2. Pega o próximo valor, compara com os anteriores até descobrir em que posição ele deveria estar 3. Abre espaço no vetor para encaixar o valor na posição correta 4. Encaixa o valor na posição correta 5. Se vetor ainda não terminou, volta para o passo 2 200 300 201 A
  • 33. FUNCIONAMENTO DO INSERTION SORT 1. Assume que o primeiro valor já está ordenado 2. Pega o próximo valor, compara com os anteriores até descobrir em que posição ele deveria estar 3. Abre espaço no vetor para encaixar o valor na posição correta 4. Encaixa o valor na posição correta 5. Se vetor ainda não terminou, volta para o passo 2 200 215 300 201 A
  • 34. FUNCIONAMENTO DO INSERTION SORT 1. Assume que o primeiro valor já está ordenado 2. Pega o próximo valor, compara com os anteriores até descobrir em que posição ele deveria estar 3. Abre espaço no vetor para encaixar o valor na posição correta 4. Encaixa o valor na posição correta 5. Se vetor ainda não terminou, volta para o passo 2 200 215 300 201 A
  • 35. FUNCIONAMENTO DO INSERTION SORT 1. Assume que o primeiro valor já está ordenado 2. Pega o próximo valor, compara com os anteriores até descobrir em que posição ele deveria estar 3. Abre espaço no vetor para encaixar o valor na posição correta 4. Encaixa o valor na posição correta 5. Se vetor ainda não terminou, volta para o passo 2 200 215 300 A
  • 36. FUNCIONAMENTO DO INSERTION SORT 1. Assume que o primeiro valor já está ordenado 2. Pega o próximo valor, compara com os anteriores até descobrir em que posição ele deveria estar 3. Abre espaço no vetor para encaixar o valor na posição correta 4. Encaixa o valor na posição correta 5. Se vetor ainda não terminou, volta para o passo 2 200 201 215 300 A
  • 37. ALGORITMO INSERTION SORT procedure insertionSort(A: array, size: int) { //ENTRADA: A: array com as chaves (posições vão de [0, tam-1]); // size: tamanho do array //SAÍDA: A: array ordenado for j := 1 to size-1 do { key := A[j]; i := j – 1; while (i >= 0) and (A[i] > key) do { A[i+1] := A[i]; i := i –1; } A[i+1] := key }
  • 38. INSERTION SORT PARA ORDENAR FUNCIONÁRIOS USANDO VETOR EM MEMÓRIA Ver código no site da disciplina INSTITUTO DE COMPUTAÇÃO - UFF 38
  • 39. COMPLEXIDADE DO INSERTION SORT Complexidade pior caso O(n2) Complexidade caso médio O(n2) Complexidade melhor caso O(n) Complexidade de espaço O(n)
  • 40. OUTROS ALGORITMOS DE ORDENAÇÃO Selection Sort Buble Sort Quick Sort ... INSTITUTO DE COMPUTAÇÃO - UFF 40
  • 41. ORDENAÇÃO DE ARQUIVOS Qualquer algoritmo de ordenação pode ser usado para ordenar arquivos, desde que: ­ os registros caibam todos na memória de uma só vez Alternativa que gasta menos memória: ­ Fazer a ordenação direto no arquivo, sem usar um vetor auxiliar ­ Só pode ser feito para arquivos binários, pois é necessário usar seek para se deslocar de um registro a outro INSTITUTO DE COMPUTAÇÃO - UFF 41
  • 42. INSERTION SORT DIRETO NO ARQUIVO Ver código no site da disciplina INSTITUTO DE COMPUTAÇÃO - UFF 42
  • 43. EXERCÍCIO Implementar uma função que faz o Selection Sort direto no arquivo, sem usar um vetor auxiliar void selection_sort_disco(FILE *arq, int tam) Lembrete: o Selecion Sort percorre o arquivo, procurando o menor elemento. Quando encontra, coloca-o na posição 1 (troca o elemento da posição 1 por ele). Depois, procura o próximo menor. Quando encontra, coloca-o na posição 2 (troca o elemento menor pelo da posição 2), e assim por diante. INSTITUTO DE COMPUTAÇÃO - UFF 43
  • 44. REFERÊNCIA Schildt, H. C Completo e Total. Ed. McGraw-Hill INSTITUTO DE COMPUTAÇÃO - UFF 44