Buscar

3 - Listas Lineares Sequenciais Ordenadas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 43 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 43 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 43 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Aula 3 
Listas Lineares Sequenciais Ordenadas 
 
prof Leticia Winkler 
 
1 
Listas Lineares Sequenciais Ordenadas 
 Elementos da lista estão dispostos num vetor (contíguos na 
memória) e ordenado de acordo com alguma informação 
 A ordenação pode ser crescente ou decrescente 
 Exemplo: 
 Ordenados crescente por nome 
 
 
 
 Ordenados decrescente pelo resultado 
 
Prof. Leticia Winkler 2 
Bia 8.5 Ana 5.5 Leo 7.5 Ruy 10.0 
Bia 8.5 Ana 5.5 Leo 7.5 Ruy 10.0 
Observações 
 Operação de inicialização, fundamental antes de 
qualquer outra operação; 
 Verificação se a lista está vazia ou cheia, não mudam se 
a lista está ou não ordenada; 
 Pode–se fazer uma busca seqüencial em uma lista já 
ordenada; 
 Normalmente a operação de busca mais apropriada em 
uma lista ordenada é a busca Binária; 
 A inserção, remoção em uma lista ordenada é 
diferente, já que a ordenação dos elementos deve ser 
mantida após estas operações. 
Prof. Leticia Winkler 3 
Criação da Lista 
 Supondo uma lista de números reais. 
 A criação da lista se constitui na operação de declaração 
das variáveis que descrevem a lista. 
float v[10]; // lista propriamente dita – capacidade de 10 elementos 
int n; // quantidade de elementos existentes em v 
 
Prof. Leticia Winkler 4 
... 
0 1 2 3 ... 9 8 7 6 
Inicialização da Lista 
 Numa Lista Linear Sequencial a inicialização se 
constitui em atribuir 0 a quantidade de elementos 
existente na lista (indicada pela variável n) 
n = 0; 
 
Prof. Leticia Winkler 5 
... 
0 1 2 3 ... 9 8 7 6 
Inserção mantendo a Ordem 
 Consiste em adicionar um valor no vetor, mantendo a 
ordem existente e ajustando o total de elementos. 
 Só pode ocorrer, no entanto, se a lista não estiver cheia. 
 Protótipo: 
void inserirEmOrdem(float [], float , int &, int); 
 Chamada na main: 
cout << “Digite um valor para inserção ordenada : “; 
cin >> valor; 
inserirEmOrdem(v,valor,n,10); 
 
Prof. Leticia Winkler 6 
Mecanismo de Inserção 
 Supondo a lista ordenada, onde n == 6 (existem 6 elementos): 
 
 
 Deseja-se inserir o valor 4.5 
 Verifica-se se a lista está cheia, caso positivo, não pode inserir; 
senão 
 Inicia a comparação do 4.5 com o elemento da posição zero, depois 
com o da posição 1, e assim por diante, até se encontrar um valor 
maior que 4.5, que ocorrerá na posição 4 (esta será a posição de 
inserção do 4.5) 
 
 
Prof. Leticia Winkler 7 
1.5 2.7 3.6 
0 1 2 3 
4.7 5.9 
4 5 6 7 
4.1 
8 9 
1.5 2.7 3.6 
0 1 2 3 
4.7 5.9 
4 5 6 7 
4.1 
8 9 
Mecanismo de Inserção 
 Desloca-se os elementos para direita, a partir da última 
posição (no exemplo, é a posição 5) para posição 
seguinte, até a posição de inserção do 4.5 (posição 4) 
 
Prof. Leticia Winkler 8 
1.5 2.7 3.6 
0 1 2 3 
4.7 5.9 
4 5 6 7 
4.1 
8 9 
1.5 2.7 3.6 
0 1 2 3 
4.7 5.9 
4 5 6 7 
4.1 
8 9 
5.9 
Mecanismo de Inserção 
 Continua o deslocamento até chegar a posição de 
inserção do 4,5 – posição 4 
Prof. Leticia Winkler 9 
1.5 2.7 3.6 
0 1 2 3 
4.7 5.9 
4 5 6 7 
4.1 
8 9 
1.5 2.7 3.6 
0 1 2 3 
4.7 4.7 
4 5 6 7 
4.1 
8 9 
5.9 
5.9 
Posição de inserção do 4.5 
Mecanismo de Inserção 
 Insere o 4.5 
 
 
 
 
 Atualiza a quantidade de elementos da lista (passa a 
ser 7) 
n++; 
 
Prof. Leticia Winkler 10 
1.5 2.7 3.6 
0 1 2 3 
4.5 4.7 
4 5 6 7 
4.1 
8 9 
5.9 
Código da Função para Inserir em Ordem 
void inserirEmOrdem(float v[], float valor, int &n, int tam) { 
 int i, posicao; 
 if (n == tam) { // testa se o vetor está cheio 
 cout << "ERRO : Lista cheia." << endl; 
 return; // sai da função sem retornar valor algum 
 } 
 if (n==0) { 
 posicao = 0; 
 } 
 else { 
 // Procura a posição de inserção 
 i = 0; 
 while (valor > v[i] && i < n) 
 i++; 
 posicao = i; // armazena a posição onde o valor será inserido 
 // Desloca os elementos, mantendo a ordem 
 for (i = n; i > posicao; i--) 
 v[i] = v[i-1]; 
 } 
 // Insere na posição de inserção 
 v[posicao] = valor; 
 n++; // Incrementa a quantidade de nós na lista 
} Prof. Leticia Winkler 11 
Busca Binária 
 Consiste em fazer uma busca em um vetor já ordenado 
 
 
 
 Esta operação será implementada por uma função que retornará o 
índice do elemento (sucesso na busca) ou -1 (fracasso na busca). 
 Protótipo: 
void buscaBinaria(float v[], float valor,int n); 
 Chamada na main: 
cout << “Digite um valor para busca: “; 
cin >> valor; 
posicao = buscaBinaria(v,valor,n); 
 
Prof. Leticia Winkler 12 
1.5 2.7 3.6 
0 1 2 3 
4.5 4.7 5.9 
4 5 6 7 
4.1 
8 9 
Mecanismo da Busca Binária 
 Supondo-se que deseja-se buscar o valor 4.7 no vetor 
 
 
 Divide-se o espaço de busca ao meio e verifica-se, 
comparando o valor de busca (no exemplo 4.7) com o 
elemento do meio da lista. 
Prof. Leticia Winkler 13 
1.5 2.7 3.6 
0 1 2 3 
4.5 4.7 5.9 
4 5 6 7 
4.1 
8 9 
1.5 2.7 3.6 
0 1 2 3 
4.5 4.7 5.9 
4 5 6 7 
4.1 
8 9 
meio 
Espaço de busca 
Mecanismo da Busca Binária 
 
 
 
 
 
 
 
 
 
 Se a chave de busca (valor procurado) é igual ao valor central do vetor (meio) – 
a busca termina com sucesso 
 Se a chave de busca (valor procurado) é menor que o valor central do vetor 
(meio) – a busca continua na primeira metade do vetor 
 Se a chave de busca (valor procurado) é maior que o valor central do vetor 
(meio) – a busca continua na segunda metade do vetor 
 No Exemplo, a busca continua na segunda metade do vetor. 
 
Prof. Leticia Winkler 14 
1.5 2.7 3.6 
0 1 2 3 
4.5 4.7 5.9 
4 5 6 7 
4.1 
8 9 
meio 
Espaço de busca 
2ª metade 1ª metade 
Comparações: 1a 
Mecanismo da Busca Binária 
 
 
 
 
 
 
 Se a chave de busca (valor procurado) é igual ao valor central do vetor (meio) – a busca 
termina com sucesso 
 Se a chave de busca (valor procurado) é menor que o valor central do vetor (meio) – a 
busca continua na primeira metade do vetor 
 Se a chave de busca (valor procurado) é maior que o valor central do vetor (meio) – a 
busca continua na segunda metade do vetor 
 O processo se repete até que o elemento seja encontrado – a posição, onde o elemento foi encontrado, 
é retornada 
 Ou, até que o espaço de busca termine (busca acaba sem sucesso) – o valor -1 é retornado (posição 
inválida) – indica que o valor procurado não foi encontrado. 
 No Exemplo, a busca termina com sucesso e o valor 5 (posição do vetor onde o elemento 
foi encontrado) é retornado como resposta pela função que realiza a busca binária. 
Prof. Leticia Winkler 15 
4.5 5.6 
4 5 6 
meio 
4.7? 
Comparações: 2a 
4.7 
Espaço de busca 
Código da Função da Busca Binária 
int buscaBinaria(float v[], float valor, int n) { 
 int ini = 0, // inicializa o início do intervalo para a busca 
 fim = n -1, // inicializa o fim da intervalo 
 meio; // armazenará o índice do meio do intervalo 
 while (ini <= fim) { 
 meio = (ini + fim)/2; // determina o meio do intervalo 
 if (v[meio] == valor) 
 return meio; // achou o valor na área de índice meio 
 if (valor < v[meio]) 
 fim = meio -1; 
 else 
 ini = meio+1; 
 } 
 return -1; // não achou o valor no vetor 
} 
Prof. Leticia Winkler 16 
Busca Sequencial X Busca Binária 
 Supondo-se o vetor: 
 
 
 Na busca binária para localizar o 4.7 são realizadas 2 
comparações 
 Na busca sequencial seriam 6 comparações para 
localizar o valor 4.7 
 
Prof. Leticia Winkler 17 
1.5 2.7 3.6 4.1 
0 1 2 3 
4.5 4.7 5.9 
4 5 6 
4.7? 
Busca Sequencial X Busca Binária 
 Busca por um registro entre 1000 
 Busca Binária 
 complexidade: O(log n) 
 pior caso: (maior inteiro imediatamente menor que (log n)) + 1 
comparações= 10 comparações, ou seja, 10 acessos a disco. 
 Busca Sequencial 
 complexidade: O(n) 
 pior caso: 1000 
 em média: 500 
 A busca binária é mais eficiente na maioria dos casos (mais 
veloz) 
 A busca seqüencial tem a vantagem de poder ser aplicada a 
qualquer vetor (no sentido de não haver obrigatoriedade dos 
elementos do vetor vetor terem que estar ordenados). 
Prof. Leticia Winkler 18 
Remoção mantendo Ordem 
 Consiste em retirar um valor do vetor, mantendo a ordem 
existente e ajustando o total de elementos. 
 Só pode ocorrer, no entanto, se a lista não estiver vazia. 
 Caso ocorra a remoção, o total de elementos da lista deve 
ser decrementado. 
 Protótipo: 
void removerEmOrdem(float [], float , int &); 
 Chamada na main: 
cout << “Digite o valor a ser removido: “; 
cin >> valor; 
removerEmOrdem(v,valor,n); 
Prof. Leticia Winkler 19 
Mecanismo de Remoção 
 Supondo a lista ordenada, onde n == 7 (existem 7 elementos): 
 
 
 
 Deseja-se remover o valor 3.6 
 Verifica-se se a lista está vazia, caso positivo, não pode retirar; senão 
 Realiza-se uma busca do valor 3.6 para se obter a posição onde o 3.6 
está na lista (no exemplo, posição 2). 
 Pode-se realizar a busca binária, já que o vetor está ordenado 
 Deve-se verificar se o valor foi encontrado 
 No exemplo seria encontrado o valor 2 
Prof. Leticia Winkler 20 
1.5 2.7 3.6 4.1 
0 1 2 3 9 8 
4.5 4.7 5.9 
4 5 6 7 
Mecanismo de Remoção 
 Atualiza-se a quantidade de elementos da lista: 
n--; (no exemplo n passa a ser 6) 
 A partir da posição seguinte do elemento a ser 
removido, até o final, move-se os elementos para 
posição anterior 
 
Prof. Leticia Winkler 21 
1.5 2.7 3.6 4.1 
0 1 2 3 9 8 
4.5 4.7 5.9 
4 5 6 7 
1.5 2.7 4.1 4.1 
0 1 2 3 9 8 
4.5 4.7 5.9 
4 5 6 7 
Mecanismo de Remoção 
Prof. Leticia Winkler 22 
1.5 2.7 4.1 4.1 
0 1 2 3 9 8 
4.5 4.7 5.9 
4 5 6 7 
1.5 2.7 4.1 4.5 
0 1 2 3 9 8 
4.5 4.7 5.9 
4 5 6 7 
Mecanismo de Remoção 
Prof. Leticia Winkler 23 
1.5 2.7 4.1 4.5 
0 1 2 3 9 8 
4.5 4.7 5.9 
4 5 6 7 
1.5 2.7 4.1 4.5 
0 1 2 3 9 8 
4.7 4.7 5.9 
4 5 6 7 
Mecanismo de Remoção 
Prof. Leticia Winkler 24 
1.5 2.7 4.1 4.5 
0 1 2 3 9 8 
4.7 4.7 5.9 
4 5 6 7 
1.5 2.7 4.1 4.5 
0 1 2 3 9 8 
4.7 5.9 5.9 
4 5 6 7 
N == 6 
Código da Função para Remover em Ordem 
void removerEmOrdem(float v[], float valor, int &n) { 
 int i, posicao; 
 if (n == 0) { // testa se o vetor está vazio 
 cout << “ERRO : Lista vazia.” << endl; 
 return; // abandona a função removerEmOrdem – sem retorno de valor 
 } 
 //chamada para a busca binaria 
 posicao = buscaBinaria(v,valor,n); 
 if (posicao < 0) { 
 cout << “ERRO : Elemento não encontrado.” << endl; 
 return; // abandona a função removerEmOrdem – sem retorno de valor 
 } 
 // decrementa a quantidade de elementos da lista 
 n--; 
 // desloca os elementos, ajustando a lista 
 for (i = posicao; i < n; i++) 
 v[i] = v[i+1]; 
 } Prof. Leticia Winkler 25 
Prof. Leticia Winkler 26 
Ordenar 
 Ordenar é o ato de se colocar os elementos de uma 
seqüência, em uma dada relação de ordem entre si, de 
acordo com um critério pré-estabelecido. 
 Crescente 
 Decrescente 
 O termo técnico em inglês para ordenar é sort, cuja 
tradução literal é classificar. 
 Métodos (mais simples): 
 Troca ou Bolha – Bubblesort 
 Inserção – Insertion Sort 
 Seleção – Selection Sort 
 
Prof. Leticia Winkler 27 
Bubblesort 
 A idéia é percorrer o vetor diversas vezes e a cada 
passagem, fazer flutuar para o topo o menor elemento 
da sequência. 
 Essa movimentação lembra a forma como as bolhas em 
um tanque de água procuram seu próprio nível. 
 Percorre várias vezes o vetor de maneira seqüencial 
(passos). Em cada passo, 
 compara cada elemento no vetor com o seu sucessor (v[i] 
com v[i+1]) e 
 troca o conteúdo das posições em análise, caso não 
estejam na ordem desejada. 
Prof. Leticia Winkler 28 
Mecanismo do Bubblesort 
 Supondo o vetor de valores inteiros, que se deseja colocar em ordem 
crescente: 
 
 
 Iniciando da posição 0 (zero) do vetor, compara o elemento com o seu 
sucessor: 
 Compara o 53 com o 25 (posição 0 com a posição 1) 
 Se estiver na ordem desejada, não faz nada e passa para posição seguinte 
 Senão, troca os dois entre si 
 Não estão na ordem desejada, então troca 
 
 
 Continua a comparação (posição 1 com a posição 2) 
Prof. Leticia Winkler 29 
53 25 46 32 23 37 41 17 10 
25 53 46 32 23 37 41 17 10 
Mecanismo do Bubblesort 
 
 
 Compara o 53 com o 46 
 Não estão na ordem desejada – troca 
 
 
 Compara o 53 com o 32 
 Não estão na ordem desejada – troca 
 
Prof. Leticia Winkler 30 
25 53 46 32 23 37 41 17 10 
25 46 53 32 23 37 41 17 10 
25 46 32 53 23 37 41 17 10 
Mecanismo do Bubblesort 
 
 
 Compara o 53 com o 23 
 Não estão na ordem desejada – troca 
 
 
 Compara o 53 com o 37 
 Não estão na ordem desejada – troca 
 
Prof. Leticia Winkler 31 
25 46 32 23 53 37 41 17 10 
25 46 32 53 23 37 41 17 10 
25 46 32 23 37 53 41 17 10 
Mecanismo do Bubblesort 
 
 
 Compara o 53 com o 41 
 Não estão na ordem desejada – troca 
 
 
 Compara o 53 com o 17 
 Não estão na ordem desejada – troca 
 
Prof. Leticia Winkler 32 
25 46 32 23 37 41 53 17 10 
25 46 32 23 37 53 41 17 10 
25 46 32 23 37 41 17 53 10 
Mecanismo do Bubblesort 
 
 Compara o 53 com o 10 
 Não estão na ordem desejada – troca 
 
 Terminou o espaço do vetor. Está Ordenado? Não! 
 Mas o maior elemento ficou na última posição. 
 
 
 Recomeça, excluindo a última posição 
Prof. Leticia Winkler 33 
25 46 32 23 37 41 17 53 10 
25 46 32 23 37 41 17 10 53 
25 46 32 23 37 41 17 10 53 
Mecanismo do Bubblesort 
 
 
 Ordenação OK – não faz nada, passa para próxima 
posição 
 
 
 troca 
 
Prof. Leticia Winkler 34 
25 46 32 23 37 41 17 10 53 
25 46 32 23 37 41 17 10 53 
25 32 46 23 37 41 17 10 53 
Mecanismo do Bubblesort 
Prof. Leticia Winkler 35 
25 32 46 23 37 41 17 10 53 
25 32 23 46 37 41 17 10 53 
25 32 23 37 46 41 17 10 53 
25 32 23 37 41 46 17 10 53 
25 32 23 37 41 17 46 10 53 
25 32 23 37 41 17 10 46 53 
Mecanismo do Bubblesort 
Prof. Leticia Winkler 36 
25 32 23 37 41 17 10 46 53 
25 32 23 37 41 17 10 46 53 
25 23 32 37 41 17 10 46 53 
25 23 32 37 41 17 10 46 53 
25 23 32 37 41 17 10 46 53 
25 23 32 37 17 41 10 46 53 
Mecanismo do Bubblesort 
 
 
 
 Recomeça 
Prof. Leticia Winkler 37 
25 23 32 37 17 10 41 46 53 
25 23 32 37 17 41 10 46 53 
25 23 32 37 17 10 41 46 53 
23 25 32 37 17 10 41 46 53 
23 25 32 37 17 10 41 46 53 
Mecanismo do Bubblesort 
 
 
 
 
 
 Recomeça 
Prof. Leticia Winkler 38 
23 25 32 37 17 10 41 46 53 
23 25 32 17 37 10 41 46 53 
23 25 32 17 10 37 41 46 53 
23 25 32 17 10 37 41 46 53 
23 25 32 17 10 37 41 46 53 
Mecanismo do Bubblesort 
 
 
 
 
 
 Recomeça 
Prof. Leticia Winkler 39 
23 25 32 17 10 37 41 46 53 
23 25 17 32 10 37 41 46 53 
23 25 17 10 32 37 41 46 53 
23 25 17 10 32 37 41 46 53 
23 25 17 10 32 37 41 46 53 
Mecanismo do Bubblesort 
 
 
 
 Recomeça 
Prof. Leticia Winkler 40 
23 17 25 10 32 37 41 46 53 
23 17 10 25 32 37 41 46 53 
23 17 10 25 32 37 41 46 53 
17 23 10 25 32 37 41 46 53 
17 10 23 25 32 37 41 46 53 
Mecanismo do Bubblesort 
 Recomeça 
 
 
 
 
 VETOR ORDENADO!!! 
Prof. Leticia Winkler 41 
17 10 23 25 32 37 41 46 53 
10 17 23 25 32 37 41 46 53 
Código do Bubblesort 
void ordenarBolha(float v[], int n) { // n é o no. de elementos em v 
 int i , // índice 
 aux, // auxiliar para troca 
 trocou = true, 
 fim = n – 1; 
 
 while (trocou) { 
 trocou = false; // sinaliza que é falso que trocou 
 for (i = 0; i < fim;i++) { 
 if (v[i] > v[i+1]) { 
 aux = v[i]; 
 v[i] = v[i+1]; 
 v[i+1] = aux; 
 trocou = true; // sinaliza que é verdadeiro que trocou 
 } // fim if 
 } // fim for 
 fim--; // decrementa o fim 
 } 
 } 
 
Prof. Leticia Winkler 42 
Exercício #1 
 Faça um programa que declare uma lista sequencial de 
tamanho 10 para armazenar valores inteiros. Esta lista deve 
ser ordenada decrescentemente. Seu programa deve 
apresentar um menu com opções para: 
 Inserção de dados na lista 
 Remoção de dados da lista 
 Busca de um determinado valor na lista 
 Percorrer a lista 
 Obs: 
 Para cada operação deve ser criada uma função. 
 Observe que a manipulação de valores deve manter a lista 
ordenada decrescentemente. 
 Utilize a busca binária para procurar um valor dentro da lista 
Prof. Leticia Winkler 43

Outros materiais