06 - Ordenação de Vetores

Embed Size (px)

DESCRIPTION

vetores em C

Text of 06 - Ordenação de Vetores

  • Ordenao de Vetores

    Prof. Joo Paulo R. R. Leite

    joaopaulo@unifei.edu.br

    Universidade Federal de Itajub

    Aula 06:

  • Ordenao

    A ordenao de objetos uma tarefa bastante intuitiva e fcil de ser assimilada. Quando um grupo de pessoas instrudo para se por em

    fila por ordem de tamanho, dispensada qualquer outra informao para que se forme imediatamente a fila ordenada.

    Basta que se defina um critrio claro para a ordenao.

    Manter as coisas em ordem uma tarefa fundamentalem vrios contextos, como a manipulao de listas, itens de estoque, controle de dados, etc. Mas pra qu os dados precisam estar em ordem?

  • Ordenao

    Maior eficincia: A eficincia no manuseio de dados pode ser aumentada se eles forem dispostos em uma estrutura utilizando algum critrio de ordem, ou classificao.

    Ordem segundo o dicionrio Uma disposio metdica, um arranjo de coisas segundo

    certas relaes, uma disposio conveniente dos meios

    para se obterem os fins.

    O problema da ordenao, portanto, pode ser encarado to-somente como uma etapa (importante) na soluo de um problema maior, de carter mais prtico. Dificilmente a ordenao ser um fim em si mesma.

  • Ordenao

    Seria praticamente impossvel, por exemplo, encontrar um nome em uma lista telefnica desordenada: Dicionrios, ndices de livros, folhas de pagamento, contas

    bancrias, listas de estudantes...

    O uso de dados ordenados inquestionvel e precisa ser aplicado tambm computao. Banco de dados: Acelerando o processo de localizao dos

    dados; Agrupamento em categorias: Mantendo dados

    relacionados prximos, facilitando, por exemplo, o processamento de dados em blocos;

    Algoritmos: Alguns algoritmos precisam que os dados estejam em ordem para que funcionem corretamente.

  • Ordenao

    De acordo com o conceito, uma ordenao feita segundo certas relaes: preciso ser estabelecido um critrio, que defina quem precede quem na ordem.

    O critrio da ordenao varia de acordo com a aplicao e o tipo de dados, e definido pelo usurio: um conjunto de nmeros pode ser organizado de acordo com

    sua ordem de grandeza em ordem crescente ou decrescente; os nomes no caderno de telefone podem estar ordenados

    alfabeticamente pelo primeiro ou ltimo nome.

    Normalmente, o estabelecimento do critrio trivial, como no caso dos nmeros e caracteres. No entanto, para tipos de dados mais complexos, o critrio pode ser mas complicado de ser obtido. Como organizar, por exemplo, uma coleo de fotos de rostos

    de pessoas?

  • Ordenao

    Uma vez escolhido o critrio, o segundo passo a criao de um algoritmo que traduza o critrio para uma linguagem de programao. Nos algoritmos que estudaremos, o resultado da

    ordenao ser sempre a reorganizao de um dado vetor unidimensional.

    Para ordenar um vetor, seus dados precisam ser comparados entre si e movidos conforme necessrio, at que se chegue ao estado final ordenado. A eficincia do algoritmo dada pela quantidade de vezes

    que essas operaes so repetidas, em funo do tamanho da entrada.

  • Ordenao

    Como todos os dados precisam ser comparados, a grande maioria dos algoritmos de ordenao trabalha de forma iterativa, utilizando laos de repetio, onde cada volta do lao aproxima o vetor de seu estado final (ordenado). Ao conjunto de operaes realizados a cada iterao

    (comparao + movimentao) damos o nome de passo.

    Ao calcular aproximadamente a quantidade de passos necessrios para a ordenao, definimos tambm sua complexidade e quantificamos seu desempenho.

  • Ordenao

    Os dois mtodos que iremos estudar esto entre os mais simples que existem, mas no esto entre os mais eficientes.

    Os dois realizam aproximadamente N2 comparaes e movimentaes de dados, onde N o tamanho do vetor a ser ordenado. So usados em programas com quantidade moderada ou

    pequena de dados; Fceis de entender e codificar: Normalmente iro utilizar

    dois laos aninhados, o que gera a complexidade O(N2). Demonstram os princpios de ordenao por comparao.

    So eles: Bubble Sort e Selection Sort.

  • Bubble Sort

    Efetua a ordenao por comparao entre pares de elementos, trocando-os de posio caso estejam foram de ordem no par.

    Simples implementao.

    o mais antigo mtodo de ordenao e um dos mais ineficientes, pois exige mais comparaes e trocas.

    Faz com que os maiores valores sejam empurrados para o final do vetor em trocas sucessivas.

    Como uma bolha (bubble), percorrendo o vetor.

  • Bubble Sort

    Realiza varreduras no vetor, trocando pares adjacentes de elementos sempre que o prximo elemento for menor que o anterior;

    Aps uma varredura, o maior elemento est corretamente posicionado no vetor;

    Aps a i-sima varredura, os i maiores elementos esto ordenados;

    A cada varredura, o maior elemento inserido na posio ordenada e removido da posio desordenada.

  • Vantagem: Simples de ImplementarDesvantagem: Desempenho fraco.

    As funes rand() e srand() so da biblioteca stdlib.h.A funo time da biblioteca time.h.

  • Bubble Sort

    As etapas do algoritmo so: Quando i = 0, os elementos vizinhos so comparados:

    (vetor[0], vetor[1]), (vetor[1], vetor[2]), (vetor[2], vetor[3])...

    So realizadas (TAM - 1) comparaes;

    Para cada par (v[i] , v[i+1]) so trocados os valores se (v[i+1] < v[i]);

    No final da passada, o maior elemento da lista est na posio v[TAM -1];

    Quando i = 1, so realizadas as mesmas comparaes e trocas, terminando com o elemento de segundo maior valor na posio v[TAM -2];

    O processo termina com i = TAM - 1, em que o menor elemento ser armazenado na posio v[0].

  • Bubble Sort

    Considere o seguinte vetor de cinco posies: V = {7, 2, 8, 5, 4}

  • Bubble Sort

    Gerao de nmeros aleatrios: void srand(unsigned int seed)

    Inicializa o pseudo-gerador de nmeros aleatrios com seed. Utiliza a funo time(NULL) para que, a cada execuo, a semente seja diferente.

    time_t time(time_t* timer) Quando chamada com time(NULL) retorna a data e horrio atuais

    em forma de um inteiro no sinalizado (nmero de segundos desde uma data convencionada, das 0 horas de 1 de janeiro de 1970)

    int rand() Retorna um nmero inteiro pseudoaleatrio entre 1 e, pelo

    menos, 32767. Utilizar rand()%N ir gerar um nmero aleatrio entre 0 e N-1.

  • Bubble Sort

    Complexidade

    Considerando uma entrada de tamanho n: O lao externo far:

    n repeties, pois um for de 0 at n 1.

    O lao interno far: n i 1 repeties, pois um for de 0 at j i 2.

    Portanto, o nmero total de repeties da comparao + troca ser um somatrio do tipo:

    E sua complexidade O(n2). Importante observar que a quantidade de operaes

    efetuadas tambm constante para um dado n, e no depende da ordem prvia dos elementos.

  • Hands-On!

    Ordene o vetor {25, 60, 4, 92, 12, 45} utilizando o algoritmo do Bubble Sort.

  • Hands-On!

    Ordene o vetor {25, 60, 4, 92, 12, 45} utilizando o algoritmo do Bubble Sort.

  • Selection Sort

    Procura, a cada iterao, o elemento de menor (ou maior) valor e o colocam na sua posio definitiva correta.

    O algoritmo de seleo se apia em sucessivas passadas ou iteraes que trocam o elemento de menor valor com o primeiro elemento do vetor.

    1. Pesquisa seqencial seleciona a posio do menor elemento do vetor;

    2. Coloca-o na posio que lhe corresponde.

  • Selection Sort

    1. Identifica o menor elemento do vetor atravs de uma pesquisa seqencial;

    2. Compara e troca com o elemento da primeira posio do vetor;

    3. Reexamina os elementos restantes no vetor para achar o segundo menor elemento;

    4. O processo se repete at que todos os elementos do vetor sejam ordenados.

  • Vantagem: Mtodo simples de ImplementarDesvantagem: Baixo desempenho, tambm com complexidade O(n2)

  • Selection Sort

    Os elementos do vetor so adicionados ao vetor ordenado na ordem correta.

    Repare no exemplo, com o vetor inicialmente com {7, 2, 8, 5, 4}

  • Selection Sort

    Complexidade

    Considerando uma entrada de tamanho n: A primeira iterao compara o 1 elemento com os n - 1 demais: n - 1

    comparaes

    A segunda iterao compara o 2 elemento com os n 2 demais: n 2 comparaes

    ... A (n-1) iterao compara o (n-1) elemento com o ltimo: 1

    comparao

    Total de comparaes: (n-1) + (n-2) + (n-3) + ... + 1 Calculando a soma da PA: (n-1)*(n-1 + 1) / 2 = (n2 n)/2

    E sua complexidade, portanto, O(n2). Importante observar que a quantidade de operaes efetuadas

    tambm constante para um dado n, e no depende da ordem prvia dos elementos.

  • Hands-On!

    Ordene o vetor {21, 9, 17, 5, 7} utilizando o algoritmo do Selection Sort.

  • Dvidas??