2
8 O UTROS M ÉTODOS Neste capítulo serão abordados alguns métodos computacionais que são úteis em diversas aplicações distintas, mas que não se enquadram nos assuntos discutidos nos capítulos anteri- ores. C LASSIFICAÇÃO ( sorting ) Em muitas situações, o programador está de posse de um conjunto de objetos de dados que não possui uma organização ou ordenamento evidente. Neste caso, com frequência é necessário ou desejável organizar esses dados a partir de algum critério definido. Por exemplo, dado um vetor contendo quantidades numéricas que se distribuem de forma aleatória ou de uma forma não pré-determinada ao longo do vetor, deseja-se então organizar esses dados em ordem cres- cente ou decrescente. Este processo de organização de objetos de dados de acordo com algum critério é denominado classificação (sorting). Existem diversos algoritmos para implementar sorting. Dado um conjunto de N objetos de dados, os algoritmos mais eficientes que realizam sorting irão demandar um número máximo da ordem de N log 2 N operações de ponto flutuante para realizar a classificação dos dados. Dois dos algoritmos mais eficientes conhecidos são o quicksort eo heapsort . Aqui será discutido o algoritmo de inserção direta (straight insertion), o qual é o mais simples de ser implementado, mas pode demandar até N 2 operações para a sua realização. I NSERÇÃO DIRETA ( straight insertion ) O algoritmo de inserção direta, como mencionado, pode demandar até N 2 operações para realizar o sorting, mas, em compensação, é o mais simples de ser implementado. Imagine um baralho de cartas embaralhadas. Para organizar as cartas em ordem crescente, por exemplo, primeiro organiza-se as mesmas em uma linha; então compara-se a segunda com a primeira e organiza-se as mesmas na ordem escolhida. Depois compara-se a terceira com as duas primeiras e realiza-se novamente a organização entre as três. Este processo é então repetido até o final do baralho. A figura 8.1 exemplifica a aplicação do algoritmo para um vetor contendo números inteiros positivos. Neste exemplo, um conjunto de 7 números inteiros necessitou de um total de 11 permutações para a classificação, mas poderiam ser necessárias até 7 2 = 49 permutações. O algoritmo 8.1 apresenta uma implementação da inserção direta para organizar um vetor em ordem crescente. Os dados são de algum tipo numérico ou de algum outro tipo para o qual possam ser definidas as expressões relacionais. 1 O algoritmo permite a classificação de uma seção do vetor ou do vetor inteiro, sendo que inf (A) e sup (A) são, respectivamente, os limites inferior e superior do vetor A. A sub-rotina sort_pick (programa 8.1) implementa o algoritmo 8.1 em Fortran para classificar todo o vetor real arr em ordem crescente. Na saída, o vetor é retornado à unidade invocadora com os elementos de arr classificados. 1 Isto é, para o qual expressões como a>b (a, b A) façam sentido. 125

Introdução à Física Computacional - Professor

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Introdução à Física Computacional - Professor

8OUTROS MÉTODOS

Neste capítulo serão abordados alguns métodos computacionais que são úteis em diversasaplicações distintas, mas que não se enquadram nos assuntos discutidos nos capítulos anteri-ores.

CLASSIFICAÇÃO (sorting)Em muitas situações, o programador está de posse de um conjunto de objetos de dados que

não possui uma organização ou ordenamento evidente. Neste caso, com frequência é necessárioou desejável organizar esses dados a partir de algum critério definido. Por exemplo, dado umvetor contendo quantidades numéricas que se distribuem de forma aleatória ou de uma formanão pré-determinada ao longo do vetor, deseja-se então organizar esses dados em ordem cres-cente ou decrescente. Este processo de organização de objetos de dados de acordo com algumcritério é denominado classificação (sorting).

Existem diversos algoritmos para implementar sorting. Dado um conjunto de N objetos dedados, os algoritmos mais eficientes que realizam sorting irão demandar um número máximoda ordem de N log2 N operações de ponto flutuante para realizar a classificação dos dados. Doisdos algoritmos mais eficientes conhecidos são o quicksort e o heapsort. Aqui será discutido oalgoritmo de inserção direta (straight insertion), o qual é o mais simples de ser implementado,mas pode demandar até N2 operações para a sua realização.

INSERÇÃO DIRETA (straight insertion)O algoritmo de inserção direta, como mencionado, pode demandar até N2 operações para

realizar o sorting, mas, em compensação, é o mais simples de ser implementado.Imagine um baralho de cartas embaralhadas. Para organizar as cartas em ordem crescente,

por exemplo, primeiro organiza-se as mesmas em uma linha; então compara-se a segunda coma primeira e organiza-se as mesmas na ordem escolhida. Depois compara-se a terceira comas duas primeiras e realiza-se novamente a organização entre as três. Este processo é entãorepetido até o final do baralho.

A figura 8.1 exemplifica a aplicação do algoritmo para um vetor contendo números inteirospositivos. Neste exemplo, um conjunto de 7 números inteiros necessitou de um total de 11permutações para a classificação, mas poderiam ser necessárias até 72 = 49 permutações.

O algoritmo 8.1 apresenta uma implementação da inserção direta para organizar um vetorem ordem crescente. Os dados são de algum tipo numérico ou de algum outro tipo para o qualpossam ser definidas as expressões relacionais.1 O algoritmo permite a classificação de umaseção do vetor ou do vetor inteiro, sendo que inf (A) e sup (A) são, respectivamente, os limitesinferior e superior do vetor A.

A sub-rotina sort_pick (programa 8.1) implementa o algoritmo 8.1 em Fortran para classificartodo o vetor real arr em ordem crescente. Na saída, o vetor é retornado à unidade invocadoracom os elementos de arr classificados.

1Isto é, para o qual expressões como a > b (a, b ∈ A) façam sentido.

125

Page 2: Introdução à Física Computacional - Professor

126

-∞ -∞ -∞ -∞ -∞ -∞ -∞1 51 38 38 38 27 27 27

2 38 51 51 51 38 38 38

3 89 89 89 75 51 44 444 75 75 75 89 75 51 515 27 27 27 27 89 75 686 44 44 44 44 44 89 757 68 68 68 68 68 68 89

i= 2 i= 3 i= 4 i= 5 i= 6 i= 7 done

Figura 8.1: Aplicação do algoritmo de inserção direta para organizar um vetor de números inteiros em ordemcrescente.

Algoritmo 8.1 Método da inserção direta para classificar um vetor de números em ordem cres-cente.

Entrada: Vetor A; inteiros p e r, tais que inf (A) 6 p 6 r 6 sup (A).Saída: Vetor A, com os elementos da seção A (p : r) classificados. Os demais elementos de Anão são alterados.Para i = p+ 1, p+ 2, . . . , r faça

temp = A (i)j = iEnquanto que (j > p e A (j − 1) > temp) faça

A (j) = A (j − 1)j = j − 1

FimA (j) = temp

Fim Laço

Listing 8.1: Sub-rotina sort_pick: recebe como entrada um vetor real arr e usa inserção direta para classificaro vetor em ordem crescente. Na saída, o vetor arr é retornado com seus elementos classificados.

subroutine straight_sort ( arr )impl ic i t nonereal , dimension ( : ) , intent ( inout ) : : arrinteger : : i , j , nreal : : an= size ( arr )do j= 2, n

a= arr ( j )do i= j − 1, 1 , −1

i f ( arr ( i ) <= a ) ex i tarr ( i + 1)= arr ( i )

end doarr ( i + 1)= a

end doreturnend subroutine straight_sort

Autor: Rudi Gaelzer – IF/UFRGS Início: 10/2019 Impresso: 28 DE OUTUBRO DE 2019