apostila de estrutura de dados - c#

Upload: julianoconegundes

Post on 18-Oct-2015

252 views

Category:

Documents


8 download

TRANSCRIPT

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    1/41

    1

    Apostila de Estrutura de Dados e Algoritmos em C#

    Prof. Ms. Eduardo R. Marcelino

    [email protected]

    2009ndice

    Tipos Abstratos de Dados (TAD)...................................................................................................................... 2Tipos de Dados Concretos (TDC)...................................................................................................................... 2Limitaes de uma implementao.................................................................................................................... 2Complexidade Computacional........................................................................................................................... 4PILHAS ............................................................................................................................................................ 6Exerccios sobre Pilhas.................................................................................................................................... 11FILAS............................................................................................................................................................. 12LISTAS .......................................................................................................................................................... 15Exerccios Sobre Listas, Filas e Pilhas............................................................................................................. 18Apontadores ou Ponteiros............................................................................................................................... 19

    Pilhas utilizando apontadores.......................................................................................................................... 20rvores ........................................................................................................................................................... 23Caminhamento em rvores. ............................................................................................................................ 24rvores Binrias ............................................................................................................................................. 25rvores Binrias de Busca .............................................................................................................................. 26Implementao de uma rvore Binria de Busca em C# ................................................................................. 28Listas Simplesmente Encadeadas .................................................................................................................... 31Listas Duplamente Encadeadas .......................................................................................................................31Listas circulares .............................................................................................................................................. 32Grafos ............................................................................................................................................................. 33Recursividade ou Recurso ............................................................................................................................. 34Ordenao....................................................................................................................................................... 36

    Pesquisa em Memria Primria .......................................................................................................................40

    Referncias bsicas para o material desta apostila:

    [1]PEREIRA, Silvio do Lago. Estruturas de dados fundamentais Conceitos e aplicaes. So Paulo:rica, 1996.

    [2]ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Pascal e C, 2. ed. So Paulo:Pioneira Thomson Learning, 2005.

    [3]GOODRICH, M.T., TAMASSIA, R. Estruturas de Dados e Algoritmos em Java, 2. ed. Porto Alegre:Bookman, 2002.

    [4] FORBELLONE, A.L.V.,EBERSPACHER, H.F., Lgica de Programao A Construo de Alboritmos eEstrutura de Dados. 2. ed. So Paulo: 2000. Makron Books.

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    2/41

    2

    TTiippoossAAbbssttrraattoossddeeDDaaddooss((TTAADD))

    formado por um conjunto de valores e por uma srie de funes que podem ser aplicadas sobre estesvalores. Funes e valores, em conjunto, constituem um modelo matemtico que pode ser empregadopara modelar e solucionar problemas do mundo real, servido para especificar as caractersticas

    relevantes dos objetos envolvidos no problema, de que forma eles se relacionam e como podem sermanipulados. O TAD define o quecada operao faz, mas no comoo faz.

    EX: TADpara uma PILHA:Empilha (valor) Insere um valor no topo da pilha

    Entrada: valor. Sada: nenhuma.

    Desempilha - Retira um valor do topo da pilha e o devolve.Entrada: nenhuma. Sada: valor.

    TTiippoossddeeDDaaddoossCCoonnccrreettooss((TTDDCC))

    Sendo o TAD apenas um modelo matemtico, sua definio no leva em considerao como os valoressero representados na memria do computador, nem se preocupa com o tempo que ser gasto paraaplicar as funes (rotinas) sobre tais valores. Sendo assim, preciso transformar este TAD em um tipode dados concreto. Ou seja, precisamos implementar (programar) as funes definidas no TAD. durante o processo de implementao que a estrutura de armazenamento dos valores especificada, eque os algoritmos que desempenharo o papel das funes so projetados.

    Tipo Abstrato de Dados Implementao Tipo de Dados Concreto

    LLiimmiittaaeessddeeuummaaiimmpplleemmeennttaaoo

    importante notar que nem todo TAD pode ser implementado em toda sua generalidade. Imagine por

    exemplo um TAD que tenha como funo mapear todos os nmeros primos. Claramente, este um tipode dados abstrato que no pode ser implementado universalmente, pois qualquer que seja a estruturaescolhida para armazenar os nmeros primos, nunca conseguiremos mapear num espao limitado dememria um conjunto infinito de valores.Frequentemente, nenhuma implementao capaz de representar um modelo matemticocompletamente; assim, precisamos reconhecer as limitaes de uma implementao particular. Devemoster em mente que podemos chegar a diversas implementaes para um mesmo tipo de dados abstrato,cada uma delas apresentando vantagens e desvantagens em relao s outras. O projetista deve sercapaz de escolher aquela mais adequada para resolver o problema especfico proposto, tomando comomedidas de eficincia da implementao, sobretudo, as suas necessidades de espao dearmazenamentoe tempo de execuo. Abaixo, veja o quadro com a complexidade de alguns jogos:

    Damas- 5 x 10 na potncia 20

    Cerca de500.000.000.000.000.000.000posies possveis.S em 1994 um programa foicapaz de vencer um campeomundial. Em 2007 o jogo foi"solucionado" a ponto de serpossvel um programa imbatvel

    Poker americano (Texas

    holdem)- 10 na potncia 18Cerca de1.000.000.000.000.000.000posies possveis.O campeonato mundial dehumanos contra mquinascomeou nesta semana, comfavoritismo para os humanos.Um programa imbatvel podesurgir nos prximos anos

    Xadrez- 1 x 10 na potncia 45

    Cerca de1.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000 posies possveis.Em 1997, um supercomputador venceu umcampeo mundial depois de penar muito. Paracriar um programa imbatvel, porm, seriapreciso de um computador quntico, umamquina que por enquanto s existe na cabeados cientistas.

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    3/41

    3

    Trecho da entrevista com JONATHAN SCHAEFFER, pesquisador na rea de inteligncia artificial.

    Disponvel em:

    http://circuitointegrado.folha.blog.uol.com.br/arch2007-07-22_2007-07-28.html#2007_07-25_07_57_02-11453562-0

    FOLHA - Voc pretende continuar trabalhando no problema para chegar ao que os matemticoschamam de uma "soluo forte", mapeando cada uma das posies do jogo?

    SCHAEFFER -No, por uma boa razo. Pondo em perspectiva, vemos que as damas possuem 5 x 10 napotncia 20 posies. Muitas pessoas tm computadores com discos rgidos de 100 gigabytes [10 napotncia 11 bytes]. Se voc tiver uma mquina "hiper-super" voc deve ter um disco de 1 terabyte [10na potncia 12]. Se voc for a um dos 50 supercomputadores mais poderosos do mundo, voc encontrarum disco de 1 petabyte [10 na potncia 15]. Um disco rgido desses custa cerca de US$ 1 milho. Asdamas tm 10 na potncia 20 posies. Para poder gravar a soluo forte do problema eu precisaria de

    500 mil petabytes _o que custaria US$ 500 bilhes hoje. Acho que no muito factvel. Se euprocessasse a soluo, eu simplesmente no teria onde salv-la.

    Referncias:PEREIRA, Silvio do Lago. Estruturas de dados fundamentais Conceitos e aplicaes. SoPaulo: rica, 1996.

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    4/41

    4

    CCoommpplleexxiiddaaddeeCCoommppuuttaacciioonnaall

    Fonte: http://www.dca.fee.unicamp.br/~ting/Courses/ea869/faq1.html

    O que um problema computvel?

    Um problema computvel se existe um procedimento que o resolve em um nmero finito de passos, ou seja se existeum algoritmo que leve sua soluo.Observe que um problema considerado "em princpio" computvel pode no ser tratvel na prtica, devido s limitaes

    dos recursos computacionais para executar o algoritmo implementado.

    Por que importante a anlise de complexidade computacional de um algoritmo?

    A complexidade computacional de um algoritmo diz respeito aos recursos computacionais - espao de memria e tempode mquina - requeridos para solucionar um problema.Geralmente existe mais de um algoritmo para resolver um problema. A anlise de complexidade computacional portanto fundamental no processo de definio de algoritmos mais eficientes para a sua soluo. Apesar de parecercontraditrio, com o aumento da velocidade dos computadores, torna-se cada vez mais importante desenvolveralgoritmos mais eficientes, devido ao aumento constante do "tamanho" dos problemas a serem resolvidos.

    O que entendemos por tamanho de um problema?

    O tamanho de um problema o tamanho da entrada do algoritmo que resolve o problema. Vejamos os seguintesexemplos:

    A busca em uma lista de N elementos ou a ordenao de uma lista de N elementos requerem mais operaes medidaque N cresce;O clculo do fatorial de N tem o seu nmero de operaes aumentado com o aumento de N;

    A determinao do valor de F_N na sequncia de Fibonacci F_0, F_1, F_2, F_3, ... envolve uma quantidade de adiesproporcional ao valor de N.

    {encont r ando o mai or nmer o}mai or : = numer o[ 1] ; 1 operaof or cont ador : = 2 t o 10 do / / n oper aes

    i f numer o[ cont ador] > mai or t hen / / 1 operaomai or : = numer o[contador ] ; / / 1 operao

    A complexidade dada por n elementos (o elemento que determina a taxa de crescimento do algoritmo acima)ou O(n) (linear)

    For T: =1 t o 100 do / / n operaesFor X : = 1 t o 100 do / / n operaes

    Wr i t el n( T, X) ; / / 1 oper ao

    A complexidade dada por n2 (T*X) elementos ou O(n2) (quadrdico)

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    5/41

    5

    Funes limitantes superiores mais conhecidas:

    Melhor PiorConstante Logartmica Linear Quadrtica Polinomial Exponencial

    O(1) O(log n) O(n) O(n2) O(nk) com k>=1 O(an) com a > 1

    Crescimento de vrias funes

    n log n n n2 2n2 1 2 4 44 2 4 16 168 3 8 64 25616 4 16 256 65.53632 5 32 1.024 4.294.967.29664 6 64 4.096 1,84 x 1019128 7 128 16.384 3,40 x 1038

    256 8 256 65.536 1,18 x 1077

    512 9 512 262.144 1,34 x 101541024 10 1024 1.048.576 1,79 x 10308

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    6/41

    6

    PPIILLHHAASS(http://pt.wikibooks.org/wiki/Estrutura_de_Dados_II/Pilhas)

    Uma pilha uma estrutura de dados onde em todas as inseres, retiradas e acessos ocorremapenas em um dos extremos (no caso, em seu topo).

    Os elementos so removidos na ordem inversa daquela em que foram inseridos de modo que oltimo elemento que entra sempre o primeiro que sai, por isto este tipo de estrutura

    chamada LIFO(Last In - First Out).O exemplo mais prtico que costuma utilizar-se para entender o processo de pilha como uma pilhade livros ou pilha de pratos, no qual ao se colocar diversos elementos uns sobre os outros, sequisermos pegar o livro mais abaixo deveremos tirar todos os livros que estiverem sobre ele.

    Uma pilha geralmente suporta as seguintes operaes bsicas:

    TOP (topo): acessa-se o elemento posicionado no topo da pilha; PUSH (empilhar): insere um novo elemento no topo da lista; POP (desempilhar): remove o elemento do topo da lista. ISEmpty (vazia?): indica sea pilha est vazia. Size (tamanho): retorna a quantidade de elementos da pilha.

    Exemplo de utilizao de uma pilha:

    Operao Pilha (topo) ----- (base) Retorno Tamanho da PilhaEmpilhar(1) 1 1

    Vazia False 1Empilhar(2) 2,1 2Topo 2,1 2 2Empilhar(7) 7,2,1 3Tamanho 7,2,1 3 3Desempilhar 2,1 7 2Desempilhar 1 2 1Desempilhar 1 0

    Vazia True 0

    Topo da pilha: ltimoelemento inserido

    Base da pilha: primeiroelemento inserido

    EmpilharDesempilhar

    Tamanho = 5

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    7/41

    7

    // Esta pilha armazena em cada posio da pilha um dado do tipo String.

    usi ng Syst em;usi ng System. Col l ect i ons. Gener i c;usi ng Syst em. Li nq;usi ng Syst em. Text ;

    namespace Pi l haEst at i ca{

    / / def i ni o da cl asse Pi l hapubl i c cl ass Pi l ha{

    pri vat e const i nt CAPACI DADE = 10; / / def i ne o t amanho maxi mo dest a uma pi l ha.pri vat e s t r i ng[ ] dados = new s t r i ng[ CAPACI DADE] ; / / vet or par a guar dar os dados da pi l ha.pri vat e i nt t opo = - 1; / / var i vel que i r i ndi car a posi o no vet or do t opo da pi l ha.

    / / est e mtodo ret or na tr ue se a pi l ha est i ver vazi apubl i c bool vazi a( ){

    return t amanho( ) == 0;}

    / / est e mtodo i nf or ma o t amanho da pi l hapubl i c i nt t amanho( ){

    return t opo + 1;}

    / / est e mtodo empi l ha um val or st r i ng na pi l hapubl i c voi d empi l ha( s t r i ng p_val or){

    i f ( t amanho( ) == CAPACI DADE){

    t opo++;dados[ t opo] = p_val or ;

    }el se{

    Consol e. Wr i t eLi ne( "A PI LHA ESTA CHEI A! ! ! " ) ;}

    }

    / / est e mtodo desempi l ha um val or da pi l hapubl i c s t r i ng desempi l ha()

    { i f ( vazi a() == true){

    Consol e. Wr i t eLi ne( "A pi l ha est vazi a! ! !" ) ;return "" ;

    }el se{

    topo--;return dados[ t opo + 1] ;

    }}

    / / est e mtodo devol ve o val or que est no topopubl i c s t r i ng r etornat opo( ){

    i f ( vazi a() == true){Consol e. Wr i t eLi ne( "A pi l ha est vazi a! ! !" ) ;return "" ;

    }el se{

    return dados[ t opo] ;}

    }}

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    8/41

    8

    / / cl asse do pr ogr ama pr i nci pal .c l ass Pi l ha_Vetor{

    s ta t i c voi d Mai n(s t r i ng[] args){

    i nt opcao;st r i ng val or ;Pi l ha mi nhaPi l ha = new Pi l ha( ) ; / / cri a uma i nst nci a da cl asse pi l ha!

    do{

    Consol e. Wr i t e( "\ n\ n Escol ha: 1- > empi l ha 2- >desempi l ha " + " 3- >t opo 4- > t amanho 9-> sai r : " ) ;

    opcao = Convert . ToI nt 32( Consol e. ReadLi ne( ) ) ;

    i f ( opcao == 1){

    Consol e. Wri t e( ">>Di gi t e o val or que desej a empi l har : ") ;val or = Consol e. ReadLi ne( ) ;mi nhaPi l ha. empi l ha(val or ) ;

    }el se i f ( opcao == 2){

    val or = mi nhaPi l ha. desempi l ha() ;Consol e. Wr i t eLi ne( ">>Desempi l hado: {0} \ n\ n", val or ) ;

    }el se i f ( opcao == 3){

    val or = mi nhaPi l ha.r et or natopo( ) ;Consol e. Wr i t eLi ne( ">>Val or no t opo: {0} \ n\ n" , va lo r ) ;

    }el se i f ( opcao == 4){

    Consol e. Wr i t eLi ne( ">>Tamanho da pi l ha: {0}" , mi nhaPi l ha. t amanho() ) ;}el se i f ( opcao == 9){

    / / sai do pr ograma}

    }whi l e (opcao ! = 9) ;

    }

    }

    }

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    9/41

    9

    // Esta pilha armazena em cada posio da pilha um dado heterogneo( cdigo e nome)

    usi ng Syst em;usi ng System. Col l ect i ons. Gener i c;usi ng Syst em. Li nq;usi ng Syst em. Text ;

    namespace Pi l haEst at i ca{

    / / Est r ura par a armazenar dados heterogneos no vet or .publ i c struct regi str o{

    publ i c i nt codi go;publ i c s t r i ng nome;};

    / / def i ni o da cl asse Pi l hapubl i c cl ass Pi l ha{

    pri vat e const i nt CAPACI DADE = 10; / / def i ne o t amanho maxi mo dest a uma pi l ha.pri vat e regi st ro[ ] dados = new regi st r o[ CAPACI DADE] ; / / vet or par a guar dar os dados da pi l ha.pri vat e i nt t opo = - 1; / / var i vel que i r i ndi car a posi o no vet or do t opo da pi l ha.

    / / est e mtodo ret or na tr ue se a pi l ha est i ver vazi apubl i c bool vazi a( ){

    return t amanho( ) == 0;}

    / / est e mtodo i nf or ma o t amanho da pi l hapubl i c i nt t amanho( ){

    return t opo + 1;}

    / / est e mtodo empi l ha um val or st r i ng na pi l hapubl i c voi d empi l ha( regi st ro p_val or ){

    i f ( t amanho( ) == CAPACI DADE){

    t opo++;dados[ t opo] = p_val or ;

    }el se

    { Consol e. Wr i t eLi ne( "A PI LHA ESTA CHEI A! ! ! " ) ;}

    }

    / / est e mtodo desempi l ha um val or da pi l hapubl i c regi st ro desempi l ha( ){

    i f ( vazi a() == true){

    Consol e. Wr i t eLi ne( "A pi l ha est vazi a! ! !" ) ;

    regi st ro nada;nada. codi go = 0;nada. nome = "" ;return nada;

    }el se{

    topo--;return dados[ t opo + 1] ;

    }}

    / / est e mtodo devol ve o val or que est no topopubl i c regi st ro r et ornat opo( ){

    i f ( vazi a() == true){

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    10/41

    10

    Consol e. Wr i t eLi ne( "A pi l ha est vazi a! ! !" ) ;regi st ro nada;nada. codi go = 0;nada. nome = "";return nada;

    }el se{

    return dados[ t opo] ;}

    }}

    / / cl asse do progr ama pr i nci pal .c l ass Pi l ha_Vetor{

    s ta t i c voi d Mai n(s t r i ng[] args){

    i nt opcao;regi st ro dado;Pi l ha mi nhaPi l ha = new Pi l ha( ) ; / / cri a uma i nst nci a da cl asse pi l ha!

    do{

    Consol e. Wr i t e( "\ n\ n Escol ha: 1- > empi l ha 2- >desempi l ha " + " 3- >t opo 4- > t amanho 9-> sai r : " ) ;

    opcao = Convert . ToI nt 32( Consol e. ReadLi ne( ) ) ;

    i f ( opcao == 1){

    Consol e. Wri t e( ">>Di gi t e o nome para empi l har : " ) ;dado. nome = Consol e. ReadLi ne( );Consol e. Wri t e( ">>Di gi t e o cdi go para empi l har : " ) ;dado. codi go = Conver t . ToI nt 32( Consol e. ReadLi ne( ) ) ;

    mi nhaPi l ha. empi l ha(dado) ;}el se i f ( opcao == 2){

    dado = mi nhaPi l ha. desempi l ha( ) ;Consol e. Wr i t eLi ne( ">>Desempi l hado: Cdi go: {0} Nome: {1} \ n\ n",

    dado. codi go, dado. nome) ;}

    el se i f ( opcao == 3){dado = mi nhaPi l ha. retornat opo() ;Consol e. Wr i t eLi ne( ">>Dado no t opo: Cdi go: {0} Nome: {1} \ n\ n",

    dado. codi go, dado. nome) ;}el se i f ( opcao == 4){

    Consol e. Wr i t eLi ne( ">>Tamanho da pi l ha: {0}" , mi nhaPi l ha. t amanho() ) ;}el se i f ( opcao == 9){

    / / sai do pr ograma}

    }whi l e (opcao ! = 9) ;

    }}

    }

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    11/41

    11

    EExxeerrcccciioossssoobbrreePPiillhhaass

    1. Crie uma pilha que manipule a seguinte estrutura:

    Tfuncionario = registroNome : string;Salario : Real;

    end;

    Depois faa um programa para testar esta pilha (como no programa exemplo sobrepilhas).

    A pilha deve possuir os seguintes mtodos:

    Empilhar (p_funcionario); Empilhar um dado do tipo da estrutura que voc definir. Desempilhar : Tfuncionario; Desempilhar um valor e retornar o valor desempilhado RetornaTopo : Tfuncionario; Retorna o valor que est no topo da pilha Tamanho : integer; Retorna o tamanho da pilha Listar Exibe na tela os elementos da pilha, ou exibe pilha vazia. SomaSalarios : real Retorna a soma de todos os salrios de todos os funcionrios.

    Observe que no h o mtodo vazio. Portanto, para saber se a pilha est vazia, vocdever utilizar o mtodo Tamanho.

    2.Preencha a tabela abaixo, de acordo com os mtodos executados na primeira coluna:

    Operao Pilha (topo) -----(base) Retorno Tamanho da PilhaTamanhoEmpilhar(O)Empilhar(Z)RetornaTopoEmpilhar(O)Vazio?DesempilharTamanhoEmpilhar(X)RetornaTopoDesempilharEmpilhar(O)Empilhar(B)

    Veja o exemplo de preenchimento na documentao entregue sobre Pilhas.

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    12/41

    12

    FFIILLAASS

    Uma Fila (Queue) um caso particular de Listas Lineares que obedece ao critrio FIFO (First In, Firts Out,ou Primeiro a Entrar, Primeiro a Sair). Numa fila os elementos so inseridos em uma das extremidades eretirados na outra extremidade. Existe uma ordem linear para a fila que a ordem de chegada. Filasso utilizadas quando desejamos processar itens de acordo com a ordem primeiro-que-chega, primeiro-atendido.

    Uma pilha normalmente possui as seguintes operaes (mtodos):

    Enfileira ( valor ) Insere o valor no final da fila. Desenfileira Retorna o elemento do incio da fila, desenfileirando-o. Vazia Informa se a fila est fazia Tamanho retorna o tamanho da fila RetornaInicio retorna o elemento do incio da fila, mas no o desenfileira. RetornaFim retorna o elemento do final da fila, mas no o desenfileira.

    Em uma implementao com arranjos (vetores), os itens so armazenados em posies contguas damemria. Por causa das caractersticas da fila, a operao enfileira faz a parte de trs da fila expandir-see a operao desenfileira faz a parte da frente da fila contrair-se. Consequentemente a fila tende acaminhar pela memria do computador, ocupando espao na parte de trs e descartando espao na parteda frente. Com poucas inseres e retiradas de itens, a fila vai ao encontro do limite do espao de

    memria alocado para ela.

    A soluo para o problema acima imaginar um vetor como um crculo, em que a primeira posio seguea ltima. Observe que a fila segue o sentido horrio. Conforme os elementos vo sendo desenfileirados, afila anda no sentido horrio. O mesmo ocorre com os itens que vo sendo enfileirados. Para evitarsobrepor elementos no vetor, devemos verificar o tamanho da fila antes de efetuar a operao enfileirar.Os elementos Frente e Trs so variveis que indicaro em que posio no vetor esto o primeiro e oltimo elemento inserido na fila.

    Exemplo de utilizao de uma Fila:

    Operao Fila trs --- frente Retorno Tamanho da FilaTamanho 0 0Enfileirar(A) A 1

    Enfileirar(B) BA 2Vazia BA False 2Enfileirar(C) CBA 3RetornaFrente CBA A 3RetornaTras CBA C 3Desenfilera CB A 2Desenfilera C B 1Desenfilera C 0

    Vazia True 0RetornaFrente ERRO 0

    Frente

    Trs Implementao circular para filas

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    13/41

    13

    // Implementao de uma fila circular em C# utilizando vetor

    usi ng Syst em;usi ng System. Col l ect i ons. Gener i c;usi ng Syst em. Li nq;usi ng Syst em. Text ;

    namespace Fi l aEstat i ca{

    cl ass F i l a{const i nt CAPACI DADE = 10; / / capaci dade mxi ma da f i l apr i vate i nt quant i dade = 0; / / qt de de el ementos enfi l ei r adospr i vate i nt i ni ci o = 0; / / i ndi ca qual a pr i mei r a posi o da f i l apr i vate i nt f i m = 0; / / i ndi ca a pr xi ma posi opr i vate st r i ng[ ] dados = new s t r i ng[ CAPACI DADE] ; / / este vet or i r ar mazenar os dados da f i l a

    / / r et or na o t amanho da f i l apubl i c i nt t amanho( ){

    return quant i dade;}

    / / enf i l ei ra umval or st r i ngpubl i c voi d enf i l ei rar ( s t r i ng p_val or ){

    i f ( t amanho( ) == CAPACI DADE){

    Consol e. Wr i t eLi ne( "A f i l a est chei a! !! ! ") ;}el se{

    dados[ f i m ] = p_val or ;f i m = (f i m + 1) % CAPACI DADE;quant i dade++;

    }}

    / / r emove o pr i mei r o el ement o da f i l a e devol ve.publ i c s t r i ng desenf i l ei ra(){

    i f ( t amanho( ) == 0){Consol e. Wr i t eLi ne( "A f i l a est vazi a! " ) ;return "" ;

    }el se{

    st r i ng val or = dados[ i ni ci o];i ni ci o = ( i ni ci o + 1) % CAPACI DADE;quanti dade - - ;return val or ;

    }}

    } / / f i mda cl asse Fi l a

    / / progr ama pr i nci pal para test ar a f i l a ci r cul ar .c l ass Fi l aEstat i ca{

    st at i c voi d Mai n( s t r i ng[] args){

    s t r i ng opcao, val or;F i l a mi nhaf i l a = new F i l a( ) ;

    Consol e. Wr i t eLi ne( "Si st ema em C# par a t estar a execuo de uma f i l a ci r cul ar\ n") ;

    do{

    Consol e. Wr i t eLi ne( "\ n\ nDi gi t e: 1- >Enf i l ei r ar 2- >Desenf i l ei rar " +

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    14/41

    14

    "3- > Tamanho 9- >Sai r ") ;opcao = Consol e. ReadLi ne( ) ;

    swi t ch ( opcao) {case "1":

    Consol e. Wr i t eLi ne( "Di gi t e um val or para enf i l ei rar: ") ;val or = Consol e. ReadLi ne( ) ;mi nhaf i l a. enf i l ei rar( val or ) ;break;

    case "2":Consol e. Wr i t eLi ne( "Desenf i l ei rado: {0}" , mi nhaf i l a. desenf i l ei ra( ) ) ;break;

    case "3":Consol e. Wr i t eLi ne( "Tamanho da f i l a: {0}", mi nhaf i l a. t amanho( ) );break;

    case "9":Consol e. Wr i t eLi ne( "Sai ndo do si st ema. . . ") ;break;

    defaul t :Consol e. Wr i t eLi ne( "Opo i nvl i da! ! !" ) ;break;

    }

    }whi l e ( opcao != "9") ;}

    } / / f i m da cl asse F i l aEst at i ca

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    15/41

    15

    LLIISSTTAASS

    http://www.inf.ufsc.br/~ine5384-hp/Capitulo2/EstruturasLista.html

    Uma Estrutura de Dados Lista um conjunto de dados dispostos e/ou acessveis em uma seqnciadeterminada.

    Este conjunto de dados pode possuir uma ordem intrnseca (Lista Ordenada) ou no. Este conjunto de dados pode ocupar espaos de memria fisicamente consecutivos,

    espelhando a sua ordem, ou no. Se os dados estiverem dispersos fisicamente, para que este conjunto seja uma lista, ele deve

    possuir operaes e informaes adicionais que permitam que seja tratado como tal (ListaEncadeada).

    O conjunto de operaes a ser definido depende de cada aplicao. Um conjunto de operaesnecessrio a uma maioria de aplicaes :

    1. Criar uma lista linear vazia. 2. Inserir um novo item imediatamente aps o i-simo item. 3. Retirar o i-simo item. 4. Localizar o i-simo item para examinar e/ou alterar o contedo de seus componentes. 5. Combinar duas ou mais listas lineares em uma lista nica. 6. Partir uma lista linear em duas ou mais listas. 7. Fazer uma cpia da lista linear. 8. Ordenar os itens da lista em ordem ascendente ou descendente, de acordo com alguns de

    seus componentes. 9. Pesquisar a ocorrncia de um item com um valor particular em algum componente.

    IMPLEMENTAO DE LISTAS LINEARES POR MEIO DE ARRANJOS

    Os itens da lista so armazenados em posies contguas de memria. A lista pode ser percorrida em qualquer direo. A insero de um novo item pode ser realizada aps o ltimo item com custo constante. A insero de um novo item no meio da lista requer um deslocamento de todos os itens

    localizados aps o ponto de insero. Retirar um item do incio da lista requer um deslocamento de itens para preencher o espao

    deixado vazio.

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    16/41

    16

    Abaixo, listagem de uma implementao de Lista com Arranjos:

    usi ng Syst em;usi ng System. Col l ect i ons. Gener i c;usi ng Syst em. Text ;

    namespace Li staEst at i ca{

    publ i c cl ass Li sta{

    pri vat e const i nt CAPACI DADE = 10;

    pri vat e s t r i ng[ ] dados = new s t r i ng[ CAPACI DADE] ;pri vat e i nt quanti dade = 0;

    publ i c i nt t amanho( ){

    return quant i dade;}

    publ i c voi d i nsereNaPosi cao( i nt p_posi cao, s t r i ng p_val or ){

    i f ( t amanho( ) == CAPACI DADE){

    Consol e. Wr i t eLi ne( "A l i sta est chei a!! !\ n\ n" ) ;}el se{

    quant i dade++;f or ( i nt i = t amanho( ) - 1; i > p_posi cao; i - - ){

    dados[ i ] = dados[ i - 1];}dados[ p_posi cao] = p_val or;

    }}

    publ i c s t r i ng removeDaPosi cao( i nt posi cao){

    i f ( t amanho( ) == 0){

    Consol e. Wr i t eLi ne( "A l i sta est vazi a!! !! ") ;return "" ;

    }el se{

    st r i ng aux = dados[ posi cao];f or ( i nt i = posi cao; i < t amanho() - 1 ; i ++){

    dados[ i ] = dados[ i + 1] ;}quant i dade- - ;return aux;

    }}

    publ i c voi d i nsereNoI ni ci o(s t r i ng p_val or ){

    i nser eNaPosi cao( 0, p_val or );}

    publ i c voi d i nsereNoFi m( st r i ng p_val or ){

    i nser eNaPosi cao( t amanho( ) , p_val or ) ;}

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    17/41

    17

    publ i c voi d i mpr i meLi st a(){

    Consol e. Wr i t eLi ne( "\ n\ nI mpresso dos dados da l i st a: \ n") ;f or ( i nt i = 0; i < t amanho( ) ; i ++){

    Consol e. Wr i t eLi ne( dados[i ] ) ;}

    }} / / f i mda cl asse l i s ta

    cl ass Progr am_Li st aEst at i ca{

    sta t i c voi d Mai n(s t r i ng[] args){

    st r i ng opcao, val or ;i nt posi cao;Li st a mi nhaLi st a = new Li s t a( ) ;Consol e. Wr i t eLi ne( "Si st ema em C# par a test ar a execuo de uma l i st a est t i ca\n") ;do{

    Consol e. Wr i t eLi ne( " \ nDi gi te: \ n 1-> I nser i r no i n ci o \ n 2- > I nser i r no f i m \ n" +"3- > I nseri r emuma posi o \ n 4- > Tamanho \ n 5- > Li st ar \ n " +"6- > Remover el ement o de uma posi o \ n 9- > Sai r " ) ;

    opcao = Consol e. ReadLi ne( ) ;swi t ch ( opcao){

    case "1":Consol e. Wr i t eLi ne( "Di gi te um val or para i nser i r no i n c i o: ") ;val or = Consol e. ReadLi ne( );mi nhaLi sta. i nser eNoI ni ci o(val or );break;

    case "2":Consol e. Wr i t eLi ne( "Di gi t e um val or para i nser i r no fi m: ") ;val or = Consol e. ReadLi ne( );mi nhaLi st a. i nser eNoFi m( val or) ;break;

    case "3":Consol e. Wr i t eLi ne( "Di gi te um val or para i nser i r : ") ;val or = Consol e. ReadLi ne( );Consol e. Wr i t eLi ne( "Di gi t e a posi o: " ) ;posi cao = Conver t . ToI nt 32( Consol e. ReadLi ne( ) ) ;mi nhaLi st a. i nser eNaPosi cao ( posi cao, val or) ;

    break;case "4":Consol e. Wr i t eLi ne( "Tamanho da l i st a: {0}", mi nhaLi st a. t amanho( ) ) ;break;

    case "5":mi nhaLi st a. i mpri meLi st a( ) ;break;

    case "6":Consol e. Wr i t eLi ne( "Di gi t e a posi o que desej a remover: ") ;posi cao = Conver t . ToI nt 32( Consol e. ReadLi ne( ) ) ;Consol e. Wr i t eLi ne( "Removi do: {0} " , mi nhaLi st a. r emoveDaPosi cao(posi cao) ) ;break;

    case "9":Consol e. Wr i t eLi ne( "Sai ndo do si st ema. . . ") ;break;

    def aul t :

    Consol e. Wr i t eLi ne( "Opo i nvl i da!! ! " ) ;break;}

    } whi l e ( opcao ! = "9") ;}

    }}

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    18/41

    18

    EExxeerrcccciioossSSoobbrreeLLiissttaass,,FFiillaasseePPiillhhaass

    Sabendo-se que possvel implementar uma Pilha e uma Fila utilizando a estrutura de dados LISTA,faa:

    Exerccio 1:Dada a Estrutura de Dados LISTA descrita e implementada acima, faa o programa principal de

    forma que ele simule uma Pilha para armazenamento de strings.Deve executar os mtodos: Empilhar, Desempilhar e Tamanho.

    Exerccio 2:Dada a Estrutura de Dados LISTA descrita e implementada acima, faa o programa principal de

    forma que ele simule uma Fila para armazenamento de strings.Deve executar os mtodos: Enfileira, Desenfileira e Tamanho.

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    19/41

    19

    AAppoonnttaaddoorreess oouuPPoonntteeiirrooss

    timo material sobre apontadores:http://br.geocities.com/cesarakg/pointers.htmlhttp://www.deei.fct.ualg.pt/IC/t20_p.html

    Um apontador um tipo de varivel especial, cujo objetivo armazenar um endereo da memria. Ou seja, ele noarmazena um valor como Ol mundo ou 55. Ao invs disso, ele armazena um endereo na memria e, nesteendereo, encontra-se uma informao til, como um texto ou um nmero.

    Um apontadorcontm o endereo de um lugar na memria.

    Quando voc executa comandos tais como:I := 10 ou J := 1

    voc est acessando o contedo da varivel. O compilador procura automaticamente o endereo da varivel e acessa oseu contedo. Um apontador, entretanto, lhe permite determinar por si prprio o endereo da varivel .

    Ex:

    I := 42;

    PonteiroParaI := &I;

    Para mostrar o contedo do endereo para o qual a o ponteiro aponta, podemos utilizar:

    Writeln( *PonteiroParaI ); { exibir 42 }

    &X retorna o endereoda varivelx*p o contedodo endereo p

    Para que o apontador saiba exatamente o tamanho da informao para a qual ele aponta na memria (veja figuraabaixo), uma varivel do tipo apontador deve estar associada a um tipo especfico de varivel ou registro. Para criar umavarivel do tipo apontador, coloque o smbolo ^ na frente do tipo da varivel.

    Endereo ContedoE456 E123E455E454

    E123 42

    Varivel apontador:PonteiroParaI

    Varivel Inteira I:

    Cada tipo de dado ocupa um tamanhodiferente na memria. O apontador precisasaber para qual tipo de dado ele vaiapontar, para que ele possa acessarcorretamente a informao.

    A esquerda temos 3 tipos de dados emPascal: Byte na primeira linha, word nasegunda e longint na terceira. Veja que ostamanhos so diferentes!

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    20/41

    20

    Exemplo de um programa que utiliza apontadores:

    usi ng Syst em;usi ng System. Col l ecti ons. Gener i c;usi ng System. Li nq;usi ng Syst em. Text ;

    namespace Pont ei r os{

    cl ass Pr ogr amPontei r o{

    s t a t i c voi d Mai n( s t r i ng[] args){

    / / par a rodar este programa, voc deve conf i gur ar o seu proj eto par a rodar cdi go no pr otegi do./ / par a t ant o, v ao menu pr oj ect - > propert i es ( ul t i ma opo do menu) - > escol ha a aba BUI LD/ / e marque a opo "ALLOW UNSAFE CODE". Sal ve o pr oj et o e compi l e- o com F5.unsaf e{

    i nt * p1; / / cr i a uma vari vel que pode apont ar par a uma/ / out r a var i vel i nte i ra

    i nt numero = 7;

    / / &numero = endereo da var i vel numerop1 = &numer o; / / o pont ei r o p1 vai apontar par a o mesmo endereo

    / / que a vari vel numero

    / / *p1 - > val or armazenado no endereo apont ado por p1Consol e. Wri teLi ne( "Var i vel nmero: {0} pontei r o: {1}", numero, *p1) ;

    Consol e. Wri te( "\ nDi gi te um val or para o pont ei ro: " ) ;*p1 = Conver t . ToI nt 32( Consol e. ReadLi ne( ) ) ;

    Consol e. Wr i teLi ne( " Vari vel nmero: {0} ", numero) ;

    Consol e. ReadLi ne() ;}

    }}

    }

    PPiillhhaassuuttiilliizzaannddooaappoonnttaaddoorreess

    As pilhas criadas utilizando-se apontadores so mais eficientes, pois no precisamos especificar o tamanho inicial,tampouco necessrio definir um Limite. Cada elemento da pilha aponta para o prximo, utilizando para issoapontadores.

    Para criar uma pilha utilizando apontadores, precisamos definir uma estrutura que possua os seguintes campos:

    program Ppilha;Type

    Apontador= ^TElemento;

    TElemento = recordAnterior : apontador;dado : String;

    Cada elemento da pilha possui:

    Valor que deve ser empilhado. Apontador para o elemento anteriorna pilha.

    A base da pilha tem como elemento anterior o valor NIL.

    NIL

    Anterior

    Anterior

    Anterior

    Base

    Topo

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    21/41

    21

    end;

    Pilha = ObjectTopo :Apontador;Procedure Empilha( valor : string );...

    {pi l ha ut i l i zando apont adores}pr ogram Ppi l ha;uses crt;

    t ype{t i po de dado Apontador para apont ar par aum el ement o da pi l ha}

    Apont ador = TEl ement o;

    {est rutura que r epresent a umel ement o na pi l ha}TEl emento = r ecor d

    ant er i or : apont ador ;dado : Str i ng;

    end;

    {est r utur a que repr esenta uma pi l ha}Pi l ha = Obj ect

    Topo : Apontador;quant i dade : i nt eger;

    procedur e i ni ci al i za;f unct i on Tamanho : i nt eger ;pr ocedur e Li st ar ;procedure empi l ha( p_val or : St ri ng ) ;f unct i on desempi l ha : st ri ng;

    end;

    {i ni ci a uma pi l ha vazi a}pr ocedure Pi l ha. i ni c i al i za;begi n

    topo : = ni l ;quant i dade : = 0;

    end;

    {retorna o t amanho da pi l ha}f unct i on Pi l ha. Tamanho : i nt eger ;begi n

    Tamanho : = quant i dade;end;

    {l i st a os el ement os da pi l ha}pr ocedure Pi l ha. Li star;var el ement o : Apont ador ;begi n

    i f t amanho > 0 t henbegi n

    wr i t el n( ' I nf or maes conti das na pi l ha' ) ;el emento : = t opo;whi l e el emento NI L dobegi n

    Wr i t el n( el emento . dado ) ;el ement o : = el ement o . ant er i or;

    end;endel sebegi n

    wr i t el n( ' A pi l ha est a vazi a!! ! ' ) ;end;

    end;

    {empi l ha um val or st r i ng}pr ocedur e Pi l ha. empi l ha( p_val or : Str i ng ) ;

    var el ement o : apont ador ;Begi n

    {reser va memr i a para o novo el emento}

    new ( el ement o) ;

    el ement o . ant er i or : = t opo;el ement o . dado : = p_val or ;

    i f t amanho > 0 t henbegi n

    el ement o . ant er i or : = t opo;end;t opo : = el ement o;quant i dade : = quant i dade + 1;

    end;

    {desempi l ha um val or st r i ng}f uncti on Pi l ha. desempi l ha : st ri ng;var el ement o : apont ador ;Begi n

    i f ( t amanho = 0) t henbegi n

    desempi l ha : = ' ' ;wri t el n( ' A pi l oha esta vazi a!' ) ;

    endel sebegi n

    desempi l ha : = t opo . dado;{guarda p/ depoi s l i berar o espaco}el emento : = t opo;t opo : = t opo . ant eri or;di spose( el ement o);quant i dade : = quant i dade - 1;

    end;end;

    {pr ogr ama pri nci pal para t est ar a pi l ha}var

    Mi nhaPi l ha : Pi l ha;val or : s t r i ng;tecl a : char ;

    begi ncl r s cr ;Mi nhaPi l ha. i ni c i al i za;

    r epeatwr i t el n;wr i t el n( ' I nf orme 1- >Empi l har 2- >Desempi l har '+ ' 3->Tamanho 4- >Li st ar e 5- >Sai r ' ) ;readl n( t ecl a);

    i f ( tecl a = ' 1' ) t henbegi n

    wr i t e( ' I nf or me al go p/ empi l har: ' ) ;readl n(val or );Mi nhaPi l ha. empi l ha( val or ) ;

    end

    el se i f ( t ecl a = ' 2' ) thenbegi n

    wr i t el n( ' Desempi l hado: ' ,

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    22/41

    22

    mi nhaPi l ha. Desempi l ha ) ;endel se i f ( t ecl a = ' 3' ) thenbegi n

    wr i t el n( ' Tamanho: ' , Mi nhaPi l ha. Tamanho ) ;endel se i f ( t ecl a = ' 4' ) thenbegi n

    Mi nhaPi l ha. Li star;

    end;unt i l ( t ecl a = ' 5' ) ;

    end.

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    23/41

    23

    rrvvoorreess

    Material retirado da referncia [3].

    Uma rvore um tipo abstrato de dados que armazena elementos de maneira hierrquica. Como exceo do elementodo topo, cada elemento tem um elemento pai e zero ou mais elementos filhos. Uma rvore normalmente desenhadacolocando-se os elementos dentro de elipses ou retngulos e conectando pais e filhos com linhas retas. Normalmente oelemento topo chamado de raiz da rvore, mas desenhado como sendo o elemento mais alto, com todos os demaisconectados abaixo (exatamente ao contrrio de uma rvore real).

    EX: Uma rvore que representa a estrutura de pastas em um Hard Disk:

    Uma rvore T um conjunto de nodosque armazenam elementos em relacionamentos pai-filhocom as seguintespropriedades:

    Ttem um nodo especial, r, chamado de raizde T. Cada nodo vde Tdiferente de rtem um nodo pai u. Se um nodo u pai de um nodo v, ento dizemos que v filho de u. Dois nodos que so filhos de um mesmo pai so irmos. Um nodo externo (ou folha)se no tem filhos. Um nodo internose tem um ou mais filhos. Um subrvorede Tenraizada no nodo v a rvore formada por todos os descendentes de vem T(incluindo o

    prprio v). O ancestralde um nodo tanto um ancestral direto como um ancestral do pai do nodo. Um nodo v descendentede use u um ancestral de v. Ex: na figura acima, Meus documentos ancestral

    de 2 Semestre e 2 Semestre descendente de Meus documentos. Seja vum nodo de uma rvore T. A profundidadede v o nmero de ancestrais de v, excluindo o prprio v.

    Observe que esta definio implica que a profundidade da raiz de T 0 (zero). Como exemplo, na figura acima, aprofundidade do nodo Trabalhos 2, e a profundidade do nodo 2 semestre 3.

    A alturade um nodo o comprimento do caminho mais longo desde nodo at um n folha ou externo. Sendoassim, a altura de uma rvore a altura do nodo Raiz. No exemplo acima, a rvore tem altura 3. Tambm se dizque a altura de uma rvore T igual profundidade mxima de um nodo externo de T.

    A figura abaixo representa uma subrvore da rvore acima. Esta subrvore possui 5 nodos, onde 2 so nodos internos(Meus Documentos e Trabalhos) e 3 so nodos externos (Provas, 1 Semestre e 2 Semestre). A altura desta subarvore

    2.

    Meus documentos

    Trabalhos Provas

    1 Semestre 2 Semestre

    C:\

    Arquivos de programas WindowsMeus documentos

    Office 2000 MSN Trabalhos Provas System32 Media Config

    1 Semestre 2 Semestre

    Raiz

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    24/41

    24

    Os principais mtodos de uma rvore so: Raiz: Retorna a raizda rvore Pai(nodo):Retorna o pai de um nodo. Ocorre um erro se nodo for a raiz. Filho(nodo):Retorna os filhos de um nodo. Nodo_eh_Interno(nodo):Testa se um nodo do tipo interno. Nodo_eh_externo(nodo):Testa se um nodo do tipo externo. Nodo_eh_raiz(nodo):Testa se um nodo a raiz. Tamanho:Retorna a quantidade de nodos de uma rvore.

    CCaammiinnhhaammeennttooeemmrrvvoorreessO caminhamento de uma rvore a maneira ordenada de percorrer todos os nodos da rvore (percorrer todos os seusns, sem repetir nenhum e sem deixar de passar por nenhum). utilizada, por exemplo, para consultar ou alterar asinformaes contidas nos ns.

    Caminhamento prefixado: Um nodo visitado antes de seus descendentes. Exemplo de aplicao: Imprimir umdocumento estruturado.

    Os nmeros em vermelho indicam a ordem em que os nodos so visitados. Caso fossem impressos, o resultado seria:Documento, Captulo 1, Seo 1.1, Seo 1.2, Captulo 2, Seo 2.1, Seo 2.2, Seo 2.3, Referncias.

    Caminhamento ps-fixado: Neste caminho, um nodo visitado aps seus descendentes. Exemplo de aplicao:Calcular o espao ocupado por arquivos em pastas e sub-pastas.

    Os nmeros em vermelho indicam a ordem em que os nodos so visitados. Caso fossem impressos, o resultado seria:H1c.doc 3k, h1nc.doc 2k, homeworks/, DDR.java 10k, Stocks.java 25k, Robot.java 20k, programs/, todo.txt 1k,cs16/.

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    25/41

    25

    rrvvoorreessBBiinnrriiaassMaterial retirado da referncia [2] e [3].

    Uma rvore binria uma rvore ordenada na qual todo nodo tem, no mximo, dois filhos. Uma rvore binriaimprpria aquela que possui apenas 1 filho. J uma rvore binria prpria aquela em que todo nodo tem zero ou doisfilhos, ou seja, todo nodo interno tem exatamente 2 filhos. Isso porque um nodo externo no tem filhos, ou seja, zerofilhos. Para cada filho de um nodo interno, nomeamos cada filho como filho da esquerdae filho da direita. Essesfilhos so ordenados de forma que o filho da esquerda venha antes do filho da direita.

    A rvore binria suporta mais 3 mtodos adicionais:

    Filho_da_esquerda(nodo): Retorna o filho da esquerda do nodo. Filho_da_direita(nodo): Retorna o filho da direita do nodo. Irmo(nodo): Retorna o irmo de um nodo

    Caminhamento adicional para rvores binrias

    Caminhamento interfixado:pode ser informalmente considerado como a visita aos nodos de uma rvore da esquerdapara a direita. Para cada nodo v, o caminhamento interfixado visita vaps todos os nodos da subrvore esqueda de veantes de visitar todos os nodos da subrvore direita de v.

    O Caminhamento de Euler:sobre uma rvore binria T pode ser informalmente definido como um passeio ao redorde T, no qual iniciamos pela raiz em direo ao filho da esquerda e consideramos as arestas de T como sendo paredesque devemos sempre manter nossa esquerda. Cada nodo de T visitado trs vezes pelo caminhamento de Euler.

    Propriedades de uma rvore binriaSeja Tuma rvore binria (prpria) com nnodos e seja ha altura de T. Ento Ttem as seguintes propriedades:

    1. O nmero de nodos externos de T pelo menos h+1 e no mximo 2h.2. O nmero de nodos internos de T pelo menos h e no mximo 2h 1.3. O nmero total de nodos de T pelo menos 2h +1 e no mximo 2h+1-1.4. A profundidade de T pelo menos log(n+1) -1 e no mximo (n-1)/2.

    Os elementos acessados por estecaminhamento formam a expresso:

    2 x (a 1) + (3 x b)

    Os parnteses foram colocados para facilitar.

    Prioridade das aes para efetuar o caminhamento:

    Ao pela esquerda (antes do caminho sobrea subrvore esquerda de v);

    Ao por baixo (entre o caminhamento sobreas duas subrvores de v);

    Ao pela direita (depois do caminhamentosobre a subrvore direita de v).

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    26/41

    26

    rrvvoorreessBBiinnrriiaassddeeBBuussccaa

    Material retirado da referncia [2] e [3].

    Uma rvore de pesquisa binria uma rvore binria em que todo n interno contm um registro, e, para cada n,todos os registros com chaves menores esto na subrvore esquerda e todos os registros com chaves maiores esto nasubrvore direita.

    Podemos usar uma rvore binria de pesquisa Tpara localizar um elemento com um certo valor xpercorrendo parabaixo a rvore T. Em cada nodo interno, comparamos o valor do nodo corrente com o valor do elemento x sendo

    pesquisado. Se a resposta da questo for menor, ento a pesquisa continua na subrvore esquerda. Se a resposta for igual, ento a pesquisa terminou com sucesso. Se a resposta for maior, ento a pesquisa continua na subrvore direita. Se encontrarmos um nodo externo (que vazio), ento a pesquisa terminou sem sucesso.

    A figura acima representa uma rvore binria de pesquisa que armazena inteiros. O caminho indicado pela linha azulcorresponde ao caminhamento ao procurar (com sucesso) 36. A linha pontilhada vermelha corresponde aocaminhamento ao procurar (sem sucesso) por 70. Observe que o tempo de execuo da pesquisa em uma rvorebinria de pesquisa T proporcional altura de T.

    Estrutura para armazenar um nodo da rvore binria:

    Exemplo para os valores inseridos na ordem:1. Maria2. Mnica3. Daniela

    58

    31 90

    62

    75

    42

    36

    25

    12

    N daesquerda

    N dadireita

    Informaodo n(valor)

    Endereo N do pai

    E2 E3Maria

    E1 Nil

    E4 E5Daniela

    E2 E1

    E6 E7Mnica

    E3 E1

    Nil Nil

    E5 E2

    Nil Nil

    E4 E2

    Nil Nil

    E7 E3

    Nil Nil

    E6 E3

    Os nodos folha semvalor so necessriospara que a rvore sejaprpria

    Ordem em que oselementos foraminseridos:58,90,62,75,31,25,12,42,36

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    27/41

    27

    Algoritmo para pesquisar um valor em uma rvore binria de pesquisa:

    Pesquisa( nodo, valor_pesquisado ) : RetornoInicio

    seNodo_eh_externo(Nodo)= verdadeiro entoescreva( Erro: Valor procurado no est na rvore!);pesquisa := nil

    caso contrrioSevalor_pesquisado nodo.valor ento

    pesquisa( nodo.direita, valor_pesquisado )caso contrrio

    pesquisa := nodo.valor;Fim

    Algoritmo para inserir um valor em uma rvore binria de pesquisa:

    Insere( nodo, NovoValor )Incio

    seNodo_eh_externo(nodo) = verdadeiro entoCriaNodoExterno( nodo.esquerda )

    CriaNodoExterno( nodo.direita )Nodo.valor := NovoValorcaso contrrio

    seNovoValor nodo.valor entoInsere( nodo.direita , NovoValor)

    caso contrrioescreva(O valor j existe na rvore.);

    Fim;

    O mtodo CriaNodoExterno cria umnodo externo (sem valor e semfilhos)

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    28/41

    28

    IImmpplleemmeennttaaooddeeuummaarrvvoorreeBBiinnrriiaaddeeBBuussccaaeemmCC##

    / / cl asse para r epr ent ar 1 Nodo na r vor ecl ass Nodo{

    pr i vat e Nodo no_pai = nul l ;pr i vat e Nodo no_di rei t a = nul l ;pr i vat e Nodo no_esquer da = nul l ;pr i vat e i nt val or = 0;

    publ i c i nt get _val or ( ) { return val or ; }

    publ i c voi d set _val or( i nt v) { val or = v; }

    publ i c voi d set _no_pai ( Nodo no) { no_pai = no; }

    publ i c voi d set _no_di r ei t a( Nodo no) { no_di r ei t a = no; }

    publ i c voi d set _no_esquerda( Nodo no) { no_esquerda = no; }

    publ i c Nodo get _no_pai ( ) { return no_pai ; }

    publ i c Nodo get _no_di r ei t a( ) { return no_di r ei t a; }

    publ i c Nodo get_no_esquerda( ) { return no_esquerda; }}

    / / cl asse da rvor e de pesqui sa bi nri acl ass Ar voreBi n{

    pr i vat e Nodo rai z = nul l ; / / r ai z da r vor epr i vat e i nt qtde = 0; / / qt de de nos i nt er nospr i vat e st r i ng r esul t ado = "";

    publ i c i nt qtde_nos_i nt er nos( ) / / devol ve a qt de de ns i nt ernos{

    return qt de;}

    publ i c bool no_eh_ext erno( Nodo no) / / ver i f i ca se um det ermi nado Nodo ext erno{

    return ( no. get _no_di r ei t a( ) == nul l ) && ( no. get _no_esquer da( ) == nul l ) ;}

    publ i c Nodo cr i a_No_ext erno( Nodo Nopai ) / / cr i a um Nodo ext er no{

    Nodo no = new Nodo( ) ;no. set _no_pai ( Nopai ) ;return no;

    }

    N daesquerda

    N dadireita

    Informao do n(valor)

    Endereo N do pai

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    29/41

    29

    publ i c voi d i nser e( i nt val or) / / i nser e um val or i nt{

    Nodo no_aux;

    i f ( qt de == 0){

    / / rvor e vazi a, devemos cr i ar o pr i mei r o Nodo, que ser a r ai zno_aux = new Nodo( ) ;r ai z = no_aux;

    }

    el se{/ / l ocal i za onde deve ser i nseri do o novo n.no_aux = r ai z;whi l e ( no_eh_ext erno(no_aux) == f al se){

    i f ( val or > no_aux. get _val or ( ) )no_aux = no_aux. get_ no_di r ei t a() ;

    el seno_aux = no_aux. get _no_esquerda( ) ;

    }}/ / este er a um Nodo exter no e port ant o no t i nha f i l hos./ / Agora el e passar a t er val or . Tambmdevemos cr i ar out ros 2/ / Nodos ext er nos ( f i l hos) par a el e.no_aux. set _val or ( val or ) ;no_aux. set _no_di r ei t a( cri a_No_ext er no( no_aux)) ;no_aux. set_no_esquer da(cr i a_No_ext er no(no_aux) ) ;qt de++;

    }

    pr i vat e voi d Le_Nodo( Nodo no){

    i f ( no_eh_ext erno( no))return;

    Le_Nodo(no. get _no_esquerda() ) ;resul t ado = resul t ado + " - " + Conver t . ToI nt 32( no. get _val or ( ) ) ;Le_Nodo( no. get _no_di r ei t a( ) ) ;

    }

    / / devol ve um st r i ng com os el ement os da r vor e, emor demcr escent epubl i c s t r i ng l i st agem( ){

    resul t ado = "" ;Le_Nodo( r ai z) ;return r esul t ado;

    }}

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    30/41

    30

    Interface com o Usurio:

    Cdigo da interface com o usurio:publ i c par t i al cl ass For m1 : Form {

    pr i vat e Ar vor eBi n mi nhaAr vore = new Ar voreBi n( ) ;

    publ i c Form1(){

    I ni t i al i zeComponent ( ) ;}

    pr i vat e voi d but t on1_Cl i ck(obj ect sender , EventAr gs e){

    try{

    mi nhaAr vor e. i nsere(Conver t . ToI nt 32( t xt Val or. Text ) ) ;l i st Box1. I t ems. Add( "I nser i do: " + txtVal or . Text ) ;

    }catch{

    MessageBox. Show( "Val or i nvl i do! Di gi t e apenas nmer os! " ) ;}txtVal or. Cl ear () ;txtVal or . Focus() ;

    }

    pr i vat e voi d but t on2_Cl i ck(obj ect sender , EventAr gs e){

    l i st Box1. I t ems. Add( mi nhaAr vore. l i st agem( ) ) ;}

    pr i vat e voi d but t on3_Cl i ck(obj ect sender , EventAr gs e){

    l i st Box1. I t ems. Add( "Qt de: " + mi nhaAr vor e. qt de_nos_i nt er nos( ) ) ;}

    pr i vat e voi d but t on4_Cl i ck(obj ect sender , EventAr gs e){

    Cl ose( ) ;}

    }

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    31/41

    31

    LLiissttaassSSiimmpplleessmmeenntteeEEnnccaaddeeaaddaass

    Material retirado da referncia [2], [3] e [4].

    Em uma lista simplesmente encadeada, cada elemento contm um apontador que aponta para a o elemento seguinte. Naimplementao de listas utilizando vetores, os dados ocupavam posies contguas da memria. Sendo assim, sempreque inclumos ou apagamos um elemento no meio da lista, precisamos reorganizar os dados do vetor, o quecomputacionalmente pode ser muito custoso. Nas listas simplesmente encadeadas, os dados no ocupam posiescontguas da memria, portando operaes de remoo e incluso so executadas muito mais rapidamente. Um

    elemento de uma lista simplesmente encadeada pode ser definido como na figura abaixo:

    Quando criamos uma lista utilizando apontadores, precisamos ter uma varivel que aponta sempre para o incio da lista.Abaixo, temos um exemplo de uma lista simplesmente encadeada para armazenar nomes em ordem alfabtica:

    Para incluir um novo elemento, por exemplo, o nome Daniela, devemos apenas alterar o apontador prximo doelemento que est no endereo E2. Veja abaixo:

    Observe que a ordem dos endereos no importa. O que importa a ordem que eles esto encadeados!

    O mesmo ocorre ao se removerum elemento da lista. Veja abaixo como ficaria a remoo do elemento Cludia:

    LLiissttaassDDuuppllaammeenntteeEEnnccaaddeeaaddaass

    Material retirado da referncia [2], [3] e [4].

    A diferena de uma lista duplamente encadeada para uma lista simplesmente encadeada que em uma lista duplamenteencadeada cada elemento contm um segundo apontador que aponta para o elemento que o antecede. Assim, voc noprecisa se preocupar mais com o incio da lista. Se voc tiver um apontador para qualquer elemento da lista, podeencontrar o caminho para todos os outros elementos. Em uma lista duplamente encadeada, so necessrias variveispara apontar para o incio e para o final da lista. Abaixo temos a representao de um elemento de uma lista duplamenteencadeada:

    DADOS

    Endereo Prximo

    Ana

    E1 E2

    Cludia

    E2 E3

    Maria

    E3 NIL

    Endereo doPrimeiro: E1

    Ana

    E1 E2

    Cludia

    E2 E4

    Maria

    E3 NIL

    Endereo doPrimeiro: E1

    Daniela

    E4 E3

    Ana

    E1 E4

    Cludia

    E2 E4

    Maria

    E3 NIL

    Endereo doPrimeiro: E1

    Daniela

    E4 E3

    DADOS

    Anterior PrximoEndereo

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    32/41

    32

    Exemplo de uma lista duplamente encadeada para armazenar nomes em ordem alfabtica:

    Para Inserir e Remover elementos, o processo semelhante ao apresentado na lista simplesmente encadeada. Adiferena que na lista duplamente encadeada necessrio tambm atualizar o campo anterior dos elementos.

    LLiissttaasscciirrccuullaarreess

    Material retirado da referncia [4].

    So listas que possuem a caracterstica especial de ter, como sucessor do fim da lista, seu incio, ou melhor, o fim da listaaponta para seu incio, formando um crculo que permite uma trajetria contnua na lista. Veja o processo na ilustraoabaixo:

    Alessandra

    NIL E2

    E1Endereo doPrimeiro: E1

    Endereo doltimo: E3

    Daniela

    E1 E3

    E2

    Mnica

    E2 NIL

    E3

    Ana

    E1 E2

    Cludia

    E2 E3

    Maria

    E3 E1

    Endereo doPrimeiro: E1

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    33/41

    33

    GGrraaffooss

    Material sobre grafos: [3], [4] e http://www.inf.ufsc.br/grafos/livro.html

    Um grafo um conjunto de pontos, chamados vrtices (ou nodos ou ns), conectados por linhas, chamadas de arestas(ou arcos). Dependendo da aplicao, arestas podem ou no ter direo, pode ser permitido ou no arestas ligarem umvrtice a ele prprio e vrtices e/ou arestas podem ter um peso (numrico) associado. Se todas as arestas tm umadireo associada (indicada por uma seta na representao grfica) temos um grafo dirigido, ou dgrafo. Se todas asarestas em um grafo foram no-dirigidas, ento dizemos que o grafo um grafo no-dirigido. Um grafo que tem

    arestas no-dirigidas e dirigidas chamado de grafo misto.

    Algumas definies sobre grafos: Grau: nmero de setas que entram ou saem de um n. Grau de entrada: nmero de setas que chegam em um n X, in(X). Grau de sada: nmero de setas que saem de um n X, out(X). Fonte: todo n, cujo grau de entrada 0(zero). Sumidouro (poo): todo n, cujo grau de sada 0(zero).

    Vrtice

    Aresta

    Exemplo de um grafo no-dirigidocom 6 vrtices e 7 arestas.

    So PauloRio deJaneiro

    Cuiab

    Braslia

    Manaus

    Exemplo de um grafo dirigidocom 8 arestas e 5 vrtices.

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    34/41

    34

    RReeccuurrssiivviiddaaddeeoouuRReeccuurrssoo

    Material retirado de:http://pt.wikipedia.org/wiki/Recursividade (muito bom)http://pt.wikipedia.org/wiki/Recursividade_%28ci%C3%AAncia_da_computa%C3%A7%C3%A3o%29(timo)http://www.di.ufpe.br/~if096/recursao/ (bom)Referncia [1]

    O que Recursividade:Uma Rotina ou Funo recursiva quando ela chama a si mesma, seja de forma direta ouindireta.

    Por exemplo, segue uma definio recursiva da ancestralidade de uma pessoa: Os pais de uma pessoa so seus antepassados (caso base); Os pais de qualquer antepassado so tambm antepassados da pessoa em considerao (passo recursivo).

    Um outro exemplo simples poderia ser o seguinte:Se uma palavra desconhecida vista em um livro, o leitor pode tomar nota do nmero da pgina e colocar emuma pilha (que at ento est vazia). O leitor pode consultar esta nova palavra e, enquanto l o texto, podeachar mais palavras desconhecidas e acrescentar no topo da pilha. O nmero da pgina em que estas palavrasocorrem tambm so colocados no topo da pilha. Em algum momento do texto, o leitor vai achar uma frase ouum pargrafo onde est a ltima palavra anotada e pelo contexto da frase vai descobrir o seu significado. Entoo leitor volta para a pgina anterior e continua lendo dali. Paulatinamente, remove-se seqencialmente cada

    anotao que est no topo da pilha. Finalmente, o leitor volta para a sua leitura j sabendo o significado da(s)palavra(s) desconhecida(s). Isto uma forma de recurso.

    Clculo do Fatorial sem Recurso, usamos apenasuma estrutura de repetio (iterador)

    Clculo do Fatorial com Recursodireta

    l ong f at_ i terat i vo( i nt numer o){

    l ong r =1;

    f or ( i nt i =2; i = 2)return numero*f at_r ecur si vo( numero- 1) ;

    el sereturn numer o;

    }

    Teste de Mesa do Fatorial de 5: azul = ida(chamada recursiva) , vermelho = volta (retorno da funo recursiva)

    Resposta = Fat_recursivo(5)

    Fat_recursivo(5) = 5 * Fat_recursivo( 5 1 )

    Fat_recursivo(4) = 4 * Fat_recursivo( 4 1 )

    Fat_recursivo(3) = 3 * Fat_recursivo( 3 1 )

    Fat_recursivo(2) = 2 * Fat_recursivo( 2 1 )

    Fat_recursivo(1) = 1

    Recurso versus Iterao

    No exemplo do fatorial, a implementao iterativa tende a ser ligeiramente mais rpida na prtica do que aimplementao recursiva, uma vez que uma implementao recursiva precisa registrar o estado atual do processamentode maneira que ela possa continuar de onde parou aps a concluso de cada nova excecuo subordinada doprocedimento recursivo. Esta ao consome tempo e memria.Existem outros tipos de problemas cujas solues so inerentemente recursivas, j que elas precisam manter registros deestados anteriores. Um exemplo o percurso de uma rvore;

    1

    2

    6

    24

    120

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    35/41

    35

    Toda funo que puder ser produzida por um computador pode ser escrita como funo recursiva sem o uso de iterao;reciprocamente, qualquer funo recursiva pode ser descrita atravs de iteraes sucessivas. Todos altoritmorecursivo pode ser implementado iterativamente com a ajuda de uma pilha, mas o uso de uma pilha, de certaforma, anula as vantagens das solues iterativas.

    Tipos de Recursividade:

    Direta: Quando chama a si mesma, quando dada situao requer uma chamada da prpria Rotina em execuo para simesma. Ex: O exemplo de fatorial recursivo dado acima.

    Indireta: Funes podem ser recursivas (invocar a si prprias) indiretamente, fazendo isto atravs de outras funes:assim, "P" pode chamar "Q" que chama "R" e assim por diante, at que "P" seja novamente invocada.

    Ex:doubl e Cal cul o( doubl e a, b ){

    return Di vi de(a, b) + a + b;}

    doubl e Di vi de( doubl e a, b ){

    i f ( b == 0)b = Cal cul o( a, b + a) ;

    return a/ b;}

    Em cauda: As funes recursivas em cauda formam uma subclasse das funes recursivas, nas quais a chamadarecursiva a ltima instruo a ser executada. Por exemplo, a funo a seguir, para localizar um valor em uma listaligada recursiva em cauda, por que a ltima coisa que ela faz invocar a si mesma:

    Ex: Vamos usar como exemplo o algoritmo para pesquisar um valor em uma rvore binria de pesquisa:

    Pesquisa( nodo, valor_pesquisado ) : RetornoInicio

    seNodo_eh_externo(Nodo)= verdadeiro ento

    escreva( Erro: Valor procurado no est na rvore!);pesquisa := nilcaso contrrio

    Se valor_pesquisado nodo.valor entopesquisa( nodo.direita, valor_pesquisado )

    caso contrriopesquisa := nodo.valor;

    Fim

    Note que a funo f ator i al usada como exemplo na seo anterior no recursiva em cauda, pois depois que

    ela recebe o resultado da chamada recursiva, ela deve multiplicar o resultado por VALOR antes de retornar parao ponto em que ocorre a chamada.

    Qual a desvantagem da Recurso?Cada chamada recursiva implica em maior tempo e espao, pois, toda vez que uma Rotina chamada, todas as variveislocais so recriadas.

    Qual a vantagem da Recurso?Se bem utilizada, pode tornar o algoritmo: elegante, claro, conciso e simples. Mas, preciso antes decidir sobre o uso daRecurso ou da Iterao.

    Aqui ocorre arecursividade

    indireta!

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    36/41

    36

    OOrrddeennaaoo

    Material retirado de:Referncia [2], [3]http://pt.wikipedia.org/wiki/Algoritmo_de_ordena%C3%A7%C3%A3o (com exemplos em vrias linguagens)

    Ordenar corresponde ao processo de rearranjar um conjunto de objetos em uma ordem ascendente ou descendente. Oobjetivo principal da ordenao facilitar a recuperao posterior de itens do conjunto ordenado. Imagine como seriadifcil utilizar um catlogo telefnico se os nomes das pessoas no estivessem listados em ordem alfabtica!Existem diversos mtodos para realizar ordenao. Iremos estudar aqui dois dos principais mtodos.

    Bubble sort

    O bubble sort, ou ordenao por flutuao (literalmente "por bolha"), um algoritmo de ordenao dos mais simples. Aideia percorrer o vector diversas vezes, a cada passagem fazendo flutuar para o topo o menor elemento da sequncia.Essa movimentao lembra a forma como as bolhas em um tanque de gua procuram seu prprio nvel, e disso vem onome do algoritmo.

    No melhor caso, o algoritmo executa (n2) / 2 operaes relevantes. No pior caso, so feitas 2n2operaes. No casomdio, so feitas (5n2) / 2 operaes. A complexidade desse algoritmo de Ordem quadrtica. Por isso, ele no recomendado para programas que precisem de velocidade e operem com quantidade elevada de dados.O algoritmo pode ser descrito em pseudo-cdigo como segue abaixo. V um VECTOR de elementos que podem ser

    comparados e n o tamanho desse vector.BUBBLESORT ( V[ ] , n)1 houveTr oca : = verdade # uma var i vel de cont r ol e2 enquant o houveTroca f or verdade f aa3 houveTr oca : = f al so4 para i de 1 at n- 1 f aa5 se V[ i ] vem depoi s de V[i + 1]6 ent o t r oque V[ i ] e V[ i + 1] de l ugar e7 houveTroca : = ver dade

    Implementao em C# utilizando For e While

    cl ass C_Bubbl eSort{

    stat i c i nt [ ] Or dena_Bubbl eSort ( i nt [ ] vetor){

    i nt aux;

    f or ( i nt i = vet or. Lengt h - 1; i >= 1; i - - ){

    f or ( i nt j = 0; j vet or[ j + 1]){

    / / ef etua a tr oca de val oresaux = vetor[ j ] ;vetor[ j ] = vet or[ j + 1];vetor [j + 1] = aux;

    }}

    }return vet or;

    }

    stat i c voi d Mai n( s t r i ng[] args)

    { i nt [ ] dados = new i nt [10];

    f or ( i nt i = 0; i < dados. Length; i ++){

    Consol e. Wr i t eLi ne( " I nf or me um nmero" ) ;dados[ i ] =Convert . ToI nt 16(Consol e. ReadLi ne( )) ;

    }

    Or dena_Bubbl eSort ( dados) ;

    Consol e. Wr i t eLi ne( "\ n\ nDados or denados: " ) ;f or ( i nt i = 0; i < dados. Length; i ++){

    Consol e. Wri t eLi ne( dados[i ] ) ;}Consol e. ReadKey( ) ;

    cl ass C_Bubbl eSort{

    s t a t i c i nt [ ] Or dena_Bubbl eSort ( i nt [ ] vetor){

    i nt aux;bool houvetr oca;

    do{

    houvet r oca = f a l se;f or ( i nt j = 0; j vet or[ j + 1]){

    / / ef etua a tr oca de valor eshouvet r oca = true;aux = vetor[ j ] ;vetor[ j ] = vet or[ j + 1];vetor[ j + 1] = aux;

    }}

    }whi l e ( houvetr oca == true) ;

    return vetor;}

    s t a t i c voi d Mai n( s t r i ng[] args){

    i nt [ ] dados = new i nt [10];

    f or ( i nt i = 0; i < dados. Length; i ++){

    Consol e. Wr i t eLi ne( "I nf orme umnmer o") ;dados[i ] = Conver t . ToI nt16( Consol e. ReadLi ne()) ;

    }

    Or dena_Bubbl eSort ( dados) ;

    Consol e. Wr i t eLi ne( "\ n\ nDados ordenados: " ) ;

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    37/41

    37

    }}

    f or ( i nt i = 0; i < dados. Length; i ++){

    Consol e. Wri t eLi ne( dados[ i ] );}

    Consol e. ReadKey( ) ;}

    }

    Quicksort

    O algoritmo Quicksort um mtodo de ordenao muito rpido e eficiente, inventado por C.A.R. Hoare em 1960,quando visitou a Universidade de Moscou como estudante. Foi publicado em 1962 aps uma srie de refinamentos.

    O Quicksort adota a estratgia de diviso e conquista. Os passos so:

    1. Escolha um elemento da lista, denominado piv (de forma randmica);2. Rearranje a lista de forma que todos os elementos anteriores ao piv sejam menores ou iguais a ele, e todos os

    elementos posteriores ao piv sejam maiores ou iguais a ele. Ao fim do processo o piv estar em sua posiofinal. Essa operao denominada partio;

    3. Recursivamente ordene a sublista dos elementos menores e a sublista dos elementos maiores;A base da recurso so as listas de tamanho zero ou um, que esto sempre ordenadas. O processo finito pois a cadaiterao pelo menos um elemento posto em sua posio final e no ser mais manipulado na iterao seguinte.

    Complexidade

    O(n lg2n) no melhor casoe no caso mdio O(n2) nopior caso;

    Implementaes

    Algori tmo em por tugus estruturado

    proc qui cksor t (x :vet [ n] i nt ; i ni : i nt ; f i m: i nt ; n: i nt )var

    i nt : i , j , y, aux;

    i n ci oi

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    38/41

    38

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    39/41

    39

    Implementao em C#

    Mtodo que efetua a ordenaos ta t i c voi d Qui ckSor t ( i nt [ ] vetor , i nt esq, i nt di r ){

    i nt pi vo, aux, i , j ;i nt mei o;

    i = esq;j = di r ;

    mei o = ( i nt ) ( ( i + j ) / 2) ;pi vo = vet or [ mei o] ;

    do{

    whi l e ( vet or [ i ] < pi vo) i = i + 1;whi l e ( vet or [ j ] > pi vo) j = j - 1;

    i f ( i i ) ;

    i f ( esq < j ) Qui ckSort ( vet or , esq, j ) ;i f ( i < di r ) Qui ckSor t (vetor , i , di r ) ;

    }

    Mtodo MAIN que solicita os nmeros e chama o mtodo quicksort para ordenar.

    s ta t i c voi d Mai n( s t r i ng[] args){i nt [ ] dados = new i nt [ 10] ;

    Consol e. Wr i t eLi ne( "Ent r e com {0} nmeros" , dados. Lengt h) ;f or ( i nt i = 0; i < dados. Lengt h; i ++){

    dados[ i ] = Conver t . ToI nt 16( Consol e. ReadLi ne( ) ) ;}

    Qui ckSor t ( dados, 0, dados. Lengt h - 1) ;

    Consol e. Wr i t eLi ne( "\ n\ nNmeros or denados: \ n" ) ;f or ( i nt i = 0; i < dados. Lengt h; i ++){

    Consol e. Wr i t eLi ne ( dados[ i ] ) ;}

    Consol e. ReadLi ne( ) ;}

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    40/41

    40

    PPeessqquuiissaaeemmMMeemmrriiaaPPrriimmrriiaa

    Pesquisa seqencial

    Retirado de : http://pucrs.campus2.br/~annes/alg3_pesqseq.html[2]

    O mtodo de pesquisa mais simples que existe funciona da seguinte forma: a partir do primeiro registro, pesquisesequencialmente at encontrar a chave procurada; ento pare. A complexidade desta pesquisa no pior caso n, onde n o tamanho total do vetor sendo pesquisado.

    {Algoritmo em Pascal}Function PesquisaSequencial(vetor : array of Integer, chave,n : integer) : integer;

    Var i: integer;Achou : boolean;

    BeginPesquisaSequencial := -1; { significa que no encontrou }

    Achou := false;i:= 1;Repeat

    If vetor[i] = chave thenBegin

    Achou := true;

    PesquisaSequencial := i;End;i := i + 1;

    Until (i > n) or (achou = true);End;

    Dado o exemplo:

    5 7 1 9 3 21 15 99 4 8

    No exemplo acima, seriam necessrias 7 iteraes para encontrar o valor 15.

    Pesquisa Binria

    Retirado de : http://pt.wikipedia.org/wiki/Pesquisa_bin%C3%A1ria[2]

    A pesquisa ou busca binria ( em ingls binary search algorithm ou binary chop ) um algoritmo de busca em vetoresque requer acesso aleatrio aos elementos do mesmo. Ela parte do pressuposto de que o vetor est ordenado, erealiza sucessivas divises do espao de busca comparando o elemento buscado (chave) com o elemento no meio dovetor. Se o elemento do meio do vetor for a chave, a busca termina com sucesso. Caso contrrio, se o elemento do meiovier antes do elemento buscado, ento a busca continua na metade posterior do vetor. E finalmente, se o elemento domeio vier depois da chave, a busca continua na metade anterior do vetor. A complexidade desse algoritmo da ordemde log2 n, onde n o tamanho do vetor de busca.

    Um pseudo-cdigo recursivo para esse algoritmo, dados V o vetor com elementos comparveis, n seu tamanho e e oelemento que se deseja encontrar:

    BUSCA- BI NRI A ( V[ ], i ni ci o, f i m, e}i recebe o ndi ce no mei o de i ni ci o e f i m

    se V[ i ] i gual a eent o devol va o ndi ce i # encont r ei eseno se V[ i ] vemantes de e

    ent o faa a BUSCA- BI NRI A( V, i +1, f i m, e)seno f aa a BUSCA- BI NRI A( V, i ni ci o, i - 1, e)

  • 5/28/2018 Apostila de Estrutura de Dados - C#

    41/41

    41

    {Algortmo em Pascal}f uncti on BuscaBi nar i a (Vet or: ar ray of st r i ng; Chave: st ri ng; Di m: i nt eger) : i nt eger ;

    var i ni ci o, f i m: i nt eger ; {Auxi l i ares que represent am o i ni ci o e o f i m do vet or anal i sado}mei o: i nteger; {Mei o do vetor }

    begi nf i m : = Di m; {O val or do l t i mo ndi ce do vet or}i ni ci o := 1; {O val or do pr i mei r o ndi ce do vet or }

    r epeatmei o : = ( i ni ci o+f i m) di v 2;

    i f ( Chave = vet or[ mei o] ) thenBuscaBi nar i a : = mei o;

    i f ( Chave < vet or[ mei o] ) thenf i m: =( mei o-1);

    i f ( Chave > vet or [ mei o] ) then

    i ni ci o: =( mei o+1) ;unti l ( Chave = Vetor [ mei o]) or ( i ni ci o > f i m) ;i f ( Chave = Vet or[ mei o]) t hen

    BuscaBi nari a : = mei oel se

    BuscaBi nar i a : = - 1; {Retor na o val or encont r ado, ou - 1 se a chave nao f oi encont r ada. }end;

    rvores de pesquisa

    Vide rvores Binrias de Busca.