Computação e Programação MEMec, LEAN - 1º Semestre 2015-2016 Aula Teorica 18 Algoritmos de ordenação Função sort D.E.M. Área Científica de Controlo Automação e Informática Industrial Wrap Up da última aula Algoritmos de pesquisa A pesquisa é a operaçãode tentardetectaruma oumaisocorrênciasde um determinadovalor dentrode umalista ouvector Devolve normalmente o índice da ocorrência Pesquisa sequencial Utiliza-se em vectores ou listas desordenadas Pode ter que percorrer todo o vector se o valor procurado não fizer parte do mesmo Pesquisa binária Assume que o vector ou lista estão previamente ordenados Em geral é mais eficiente que a pesquisa sequencial Computação e Programação 2015 / 2016 2 1
Wrap Up da última aula Vectorização Nome que se dá à forma de codificar operações que envolvam vectores ou matrizes tirando partido da especialização da linguagem MATLAB neste tipo de estruturas >> mat = [4 5 6; 3 2 1]; >> for l = 1:size(mat,1) for c = 1:size(mat,2) mat(l,c)= mat(l,c) * 2; No MATLAB pode escrever-se apenas >> mat = [4 5 6; 3 2 1]; >> mat = mat * 2 Computação e Programação 2015 / 2016 3 Alinhamento da AT 18 Algoritmos de ordenação Função sort Computação e Programação 2015 / 2016 4 2
Ordenação A ordenação é oprocesso de pôr os elementos de uma lista por uma determinada ordem, ascente ou descente (existem muitos algoritmos de ordenação: Quick sort, Bubble sort, Shell sort, etc.) valor 85 70 100 95 80 91 Ascente valor 70 80 85 91 95 100 Computação e Programação 2015 / 2016 5 Ordenação por selecção (selection sort) Descrição (ascente/descente): 1. Encontrar o elemento menor/maiordo vector e trocá-lo com o da 1ª posição 2. Encontrar o elemento menor/maiordo resto do vector (da 2ª posição em diante) e trocá-lo com o elemento da 2ª posição 3. Repetir o procedimento 2.para as posições seguintes (3ª, 4ª,, etc.) até trocar o penúltimo elemento Computação e Programação 2015 / 2016 6 3
Ordenação por selecção (ascente) 1º passo valor 85 70 100 95 80 91 2º passo valor 70 85 100 95 80 91 3º passo valor 70 80 100 95 85 91 Computação e Programação 2015 / 2016 7 Ordenação por selecção (ascente) 4º passo valor 70 80 85 95 100 91 5º passo valor 70 80 85 91 100 95 valor 70 80 85 91 95 100 Computação e Programação 2015 / 2016 8 4
Ordenação por selecção (ascente) 1º passo 1 2 3 4 5 6 vec 85 70 100 95 80 91 indice_do_minimo = 1; %assume-se % procurar valor menor que o 1º for j = 2:length(vec) if vec(j) < vec(indice_do_minimo) indice_do_minimo = j; temp = vec(1); % salvaguardar valor a trocar vec(1) = vec(indice_do_minimo); % guardar o minimo na 1ª posição vec(indice_de_minimo) = temp; % completar a troca Computação e Programação 2015 / 2016 9 Ordenação por selecção (ascente) 2º passo 1 2 3 4 5 6 vec 70 85 100 95 80 91 indice_do_minimo = 2; %assume-se % procurar valor menor que o 2º for j = 3:length(vec) if vec(j) < vec(indice_do_minimo) indice_do_minimo = j; temp = vec(2); % salvaguardar valor a trocar vec(2) = vec(indice_do_minimo); % guardar o minimo na 2ª posição vec(indice_de_minimo) = temp; % completar a troca Computação e Programação 2015 / 2016 10 5
Ordenação por selecção (ascente) 3º passo 1 2 3 4 5 6 vec 70 80 100 95 85 91 indice_do_minimo = 3; %assume-se % procurar valor menor que o 3º for j = 4:length(vec) if vec(j) < vec(indice_do_minimo) indice_do_minimo = j; temp = vec(3); % salvaguardar valor a trocar vec(3) = vec(indice_do_minimo); % guardar o minimo na 3ª posição vec(indice_de_minimo) = temp; % completar a troca Computação e Programação 2015 / 2016 11 Ordenação por selecção (ascente) ( ) último passo 1 2 3 4 5 6 vec 70 80 85 91 100 95 Penúltimo elemento indice_do_minimo = 5; %assume-se % procurar valor menor que o 5º for j = 6:length(vec) if vec(j) < vec(indice_do_minimo) indice_do_minimo = j; temp = vec(5); % salvaguardar valor a trocar vec(5) = vec(indice_do_minimo); % guardar o minimo na 5ª posição vec(indice_de_minimo) = temp; % completar a troca Computação e Programação 2015 / 2016 12 6
Ordenação por selecção (ascente) % Repetir até ao penúltimo elemento do vector for i = 1:length(vec)-1 indice_do_minimo = i; %assume-se % procurar valor menor for j = i+1:length(vec) if vec(j) < vec(indice_do_minimo) indice_do_minimo = j; temp = vec(i); % salvaguardar valor a trocar vec(i) = vec(indice_do_minimo); % guardar o minimo vec(indice_de_minimo) = temp; % completar a troca Computação e Programação 2015 / 2016 13 Ordenação por selecção (ascente) Encontrar o mínimo no sub-vector Trocar o mínimo com o primeiro elemento do sub-vector Computação e Programação 2015 / 2016 14 7
Ordenação por selecção (ascente) >> vec = [85 70 100 95 80 91]; >> vec = ordenacaoporseleccao(vec) vec = 70 80 85 91 95 100 Computação e Programação 2015 / 2016 15 Ordenação de um vector de estruturas Ao ordenar um vector de estruturas, é comum fazer a ordenação apenas por um dos campos Turma AM21T Número da ficha Nome Numero Nota 1 João Silva 42331 14 2 Paulo Almeida 98734 17 3 Judite Antão 36331 15 Computação e Programação 2015 / 2016 16 8
Função do exemplo gerir alunos Função que apresenta a turma Computação e Programação 2015 / 2016 17 Ordenação de um vector de estruturas Apenas o campo relativo ao número de aluno é comparado Toda a estrutura é trocada de posição Computação e Programação 2015 / 2016 18 9
Ordenação de um vector de estruturas >> turma(1) = struct('nome','joão Silva','Numero',... 42331,'Nota',14); >> turma(2) = struct('nome','paulo Almeida',... 'Numero', 98734,'Nota',17); >> turma(3) = struct('nome','judite Antão',... 'Numero', 36331,'Nota',15); >> apresentaturma(turma) Numero Nome Nota 42331 João Silva 14 98734 Paulo Almeida 17 36331 Judite Antão 15 Computação e Programação 2015 / 2016 19 Ordenação de um vector de estruturas >> turma_ord = ordenacaovectorestruturas(turma); >> apresentaturma(turma_ord) Numero Nome Nota 36331 Judite Antão 15 42331 João Silva 14 98734 Paulo Almeida 17 Computação e Programação 2015 / 2016 20 10
Ordenação através de indexação Na ordenação através de indexação é criado um vector de índices que representa a ordenação da lista, mas a lista original não é modificada Estes índices aplicados ao vector original formam o vector ordenado valor 85 70 100 95 80 91 Ascente valor 85 70 100 95 80 91 índices ordem 2 5 1 6 4 3 Computação e Programação 2015 / 2016 21 Ordenação através de indexação Descrição: 1. Inicializar elementos do vector de índices com os valores entre 1 e o comprimento da lista 2. Utilizar qualquer algoritmo de ordenação, mas usando como índices no algoritmo os elementos do vector de índices criado 3. Quando o algoritmo de ordenação fizer a troca, trocam-se os elementos do vector de índices em vez dos elementos do vector de dados original Computação e Programação 2015 / 2016 22 11
Ordenação através de indexação 1º passo valor 85 70 100 95 80 91 índices ordem 1 2 3 4 5 6 2º passo valor 85 70 100 95 80 91 índices ordem 2 1 3 4 5 6 Computação e Programação 2015 / 2016 23 Ordenação através de indexação 3º passo valor 85 70 100 95 80 91 índices ordem 2 5 3 4 1 6 4º passo valor 85 70 100 95 80 91 índices ordem 2 5 1 4 3 6 Computação e Programação 2015 / 2016 24 12
Ordenação através de indexação 5º passo valor 85 70 100 95 80 91 índices ordem 2 5 1 6 3 4 O vector orginal não foi modificado A ordenação está representada por índices dos elementos do vector original valor 85 70 100 95 80 91 índices ordem 2 5 1 6 4 3 Computação e Programação 2015 / 2016 25 Ordenação através de indexação 1º passo 1 2 3 4 5 6 vec 85 70 100 95 80 91 indvec 1 2 3 4 5 6 posicao_indice_do_minimo = 1; %assume-se % procurar valor menor que o apontado pelo indice em 1 for j = 2:length(vec) if vec(indvec(j)) < vec(indvec(posicao_indice_do_minimo)) posicao_indice_do_minimo = j; temp = indvec(1); indvec(1) = indvec(posicao_indice_do_minimo); indvec(posicao_indice_do_minimo) = temp; Computação e Programação 2015 / 2016 26 13
Ordenação através de indexação 2º passo 1 2 3 4 5 6 vec 85 70 100 95 80 91 indvec 2 1 3 4 5 6 posicao_indice_do_minimo = 2; %assume-se % procurar valor menor que o apontado pelo indice em 2 for j = 3:length(vec) if vec(indvec(j)) < vec(indvec(posicao_indice_do_minimo)) posicao_indice_do_minimo = j; temp = indvec(2); indvec(2) = indvec(posicao_indice_do_minimo); indvec(posicao_indice_do_minimo) = temp; Computação e Programação 2015 / 2016 27 Ordenação através de indexação Cria vector de índices inicial Compara utilizando índices guardados no vector de índices Troca elementos do vector de índices Computação e Programação 2015 / 2016 28 14
Ordenação através de indexação >> x = [85 70 100 95 80 91]; >> index = criarindicesordenacao(x) index = 2 5 1 6 4 3 >> x(index) ans = 70 80 85 91 95 100 >> x x = 85 70 100 95 80 91 A ordenação através de indexação permite tratar os dados como se estivessem ordenados, mas sem ordenar realmente um vector! Computação e Programação 2015 / 2016 29 Alinhamento da AT 18 Algoritmos de ordenação Função sort Computação e Programação 2015 / 2016 30 15
Função pré-definida sort Descrição: ordena um vector, uma matriz, ou um cell array Sintaxe: [Y,I] = sort(x,dimensao,modo) >> vec = [85 70 100 95 80 91]; >> vec = sort(vec) vec = 70 80 85 91 95 100 >> sort(vec,2,'desc') ans = 100 95 91 85 80 70 Computação e Programação 2015 / 2016 31 Função de pré-definida sort >> mat = [4 6 2;8 3 7;9 7 1] mat = 4 6 2 8 3 7 9 7 1 >> sort(mat) % ou sort(mat,1) ans = 4 3 1 8 6 2 9 7 7 Ordena todas as colunas (ascente) Computação e Programação 2015 / 2016 32 16
Função de pré-definida sort >> mat = [4 6 2;8 3 7;9 7 1] mat = 4 6 2 8 3 7 9 7 1 >> mat = sort(mat,2,'desc') mat = 6 4 2 8 7 3 9 7 1 Ordena todas as linhas (descente) Computação e Programação 2015 / 2016 33 Função de pré-definida sort >> nomes = {'Rita';'Vitor';'Alzira';'Pedro';'Célia'} nomes = 'Rita' 'Vitor' 'Alzira' 'Pedro' 'Célia' >> sort(nomes) ans = 'Alzira' 'Célia' 'Pedro' 'Rita' 'Vitor' Ordena facilmente stringsarmazenadas em cell arrays Computação e Programação 2015 / 2016 34 17
Função de pré-definida sort >> [vec_ordenado,indices] = sort(vec) vec_ordenado = 70 80 85 91 95 100 indices = 2 5 1 6 4 3 >> vec(indices) ans = 70 80 85 91 95 100 Facilita bastante a ordenação por indexação Computação e Programação 2015 / 2016 35 Função de pré-definida sort Ordenar um vector de estruturas por campo numérico >> turma(1) = struct('nome','joão Silva','Numero',... 42331,'Nota',14); >> turma(2) = struct('nome','paulo Almeida',... 'Numero', 98734,'Nota',17); >> turma(3) = struct('nome','judite Antão',... 'Numero', 36331,'Nota',15); >> apresentaturma(turma) Numero Nome Nota 42331 João Silva 14 98734 Paulo Almeida 17 36331 Judite Antão 15 Computação e Programação 2015 / 2016 36 18
Função de pré-definida sort >> [num_ord index] = sort([turma.numero]) num_ord = index = 36331 42331 98734 3 1 2 >> turma = turma(index); >> apresentaturma(turma) Numero Nome Nota 36331 Judite Antão 15 42331 João Silva 14 98734 Paulo Almeida 17 É necessário construir um vector O vector de estruturas só é realmente ordenado quando se faz esta atribuição Computação e Programação 2015 / 2016 37 Função de pré-definida sort Ordenar um vector de estruturas por campo string >> [ca_nomes_ord index] = sort({turma.nome}) ca_nomes_ord = index = 'João Silva' 'Judite Antão' 'Paulo Almeida' 1 3 2 >> turma = turma(index); >> apresentaturma(turma) Numero Nome Nota 42331 João Silva 14 36331 Judite Antão 15 98734 Paulo Almeida 17 É necessário construir um cell array Computação e Programação 2015 / 2016 38 19
Referências Capítulo 13 de Stormy Attaway (2012), Matlab: A Practical Introduction to Programming and Problem Solving, Elsevier. As aulas teóricas contêm contribuições dos profs. José Borges e Miguel Silva Computação e Programação 2015 / 2016 39 20