Métodos de rdenação Prof. Yandre Maldonado - 1 rdenação Interna rdenação por Seleção; rdenação por Inserção; rdenação por Troca (Bubblesort); Prof. Yandre Maldonado e Gomes da Costa
rdenação Interna Prof. Yandre Maldonado - 2 Memória interna (primária) suficiente para armazenar os registros de dados durante o processo de ordenação; Medidas de complexidade relevantes em ordenação interna: C(n), número de comparações entre chaves; M(n), número de movimentações de itens no arquivo;
rdenação Interna Considere os seguintes tipos para os algoritmos descritos a seguir: Prof. Yandre Maldonado - 3 #define MX 40 struct pessoa { char nome[30]; int idade; }; pessoa cadastro[mx]; int n_cad;
rdenação por Seleção Um dos mais simples; Prof. Yandre Maldonado - 4 Princípio: selecione o menor elemento do vetor e troque-o com o item que está na primeira posição do vetor. epita estas duas operações com os n-1 itens restantes, depois com os n-2 itens, até que reste apenas um elemento.
rdenação por Seleção xemplo: Prof. Yandre Maldonado - 5 I=6 I=5 I=4 I=3 I=2 Chaves Inicias: 6 5 4 3 2 1
lgoritmo: void ordena_selecao (void) { int i, j, min; pessoa x; Prof. Yandre Maldonado - 6 for (i=0;i<=n_cad-2;i++) { min=i; for (j=i+1;j<=n_cad-1;j++) if (strcmp(cadastro[j].nome,cadastro[min].nome)<0) min=j; x=cadastro[min]; cadastro[min]=cadastro[i]; cadastro[i]=x; } } Seleciona o menor Faz a troca
rdenação por Seleção Prof. Yandre Maldonado - 7 nálise de complexidade: C(n) = (n 2 /2) (n/2) M(n) = 3 (n-1) m condições normais, com chaves do tamanho de uma palavra, este método é bastante interessante para arquivos com até 1000 registros; specto negativo: o fato de o arquivo já estar parcialmente ordenado não reduz em nada o custo da ordenação.
rdenação por Inserção Prof. Yandre Maldonado - 8 este método, a seqüência a ser ordenada é varrida a partir da posição 2, e cada item apanhado na seqüência é inserido no seu lugar apropriado em relação aos itens anteriores da seqüência; colocação do item no seu lugar apropriado na seqüência destino é realizada movendo-se os itens com chaves maiores para a direita e então inserindo o item na posição deixada vazia.
rdenação por Inserção xemplo: Prof. Yandre Maldonado - 9 I=6 I=5 I=4 I=3 I=2 Chaves Inicias: 6 5 4 3 2 1
lgoritmo: void ordena_insercao (void) { int i, j; pessoa x; Prof. Yandre Maldonado - 10 for (i=1;i<=n_cad-1;i++) { x=cadastro[i]; j=i-1; while ((strcmp(x.nome,cadastro[j].nome)<0) && (j>=0)) { cadastro[j+1]=cadastro[j]; //mpurra maiores para a direita j=j-1; } cadastro[j+1]=x; //insere na posicao apropriada } }
rdenação por Inserção Prof. Yandre Maldonado - 11 método de inserção é adequado para os casos em que as informações já estão quase ordenadas, pois neste caso seu custo é muito baixo; É também um bom método quando se deseja adicionar uns poucos itens à uma seqüência já ordenada.
rdenação por Troca Prof. Yandre Maldonado - 12 ste método permuta sistematicamente pares de elementos que estão fora de ordem até que não haja mais pares não-ordenados; stratégia bolha, ou bubblesort: consiste em borbulhar o maior elemento para o fim da lista;
rdenação por Troca Prof. Yandre Maldonado - 13 Inicialmente, percorre-se a lista comparando pares de elementos consecutivos e trocando os que estiverem fora de ordem. esta primeira varredura, o maior elemento é empurrado para o fim da lista; a segunda varredura, o segundo maior elemento será empurrado para a penúltima posição, e assim por diante;
Prof. Yandre Maldonado - 14 rdenação por Troca xemplo: Maior elemento no final Troca 5 e 6 Troca 4 e 5 Troca 3 e 4 Troca 2 e 3 ão troca 6 5 4 3 2 1 Varredura 1
rdenação por Troca xemplo (continuação): Varredura 2 1 2 3 4 5 6 Prof. Yandre Maldonado - 15 Troca 1 e 2 Troca 2 e 3 Troca 3 e 4 Troca 4 e 5 Segundo maior elemento empurrado para a penúltima posição
rdenação por Troca Prof. Yandre Maldonado - 16 Para uma lista de tamanho n, são necessárias n-1 varreduras, pois cada varredura leva um elemento para a sua posição definitiva no fim da sublista. menor elemento de todos vai sobrar na primeira posição; Pior caso: quando a lista está em ordem invertida, neste caso o número de trocas é igual a (n-1)+(n-2)+(n-3)+...+1;
lgoritmo: void ordena_troca (void) { int i, j; pessoa x; Prof. Yandre Maldonado - 17 for (i=0;i<=n_cad-2;i++) //controla qual é a varredura for (j=0;j<=(n_cad-2)-i;j++) //faz a varredura if (strcmp(cadastro[j+1].nome,cadastro[j].nome)<0) { x=cadastro[j]; cadastro[j]=cadastro[j+1]; //troca cadastro[j+1]=x; } }
rdenação Interna Bibliografia recomendada: Prof. Yandre Maldonado - 18 Ziviani, ivio. Projeto de lgoritmos, ditora Pioneira; Salvetti, irceu ouglas & Barbosa, Lisbete Madsen. lgoritmos, Makron Books; Wirth, iklaus. lgortimos e struturas de ados, ditora PHB;