22.10.2014 Views

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

ord<strong>em</strong> crescente, o "primeiro maior valor" é armazenado na última posição do vetor auxiliar; o "segundo<br />

maior valor" é armazenado na penúltima posição do vetor auxiliar e assim sucessivamente. Para que se<br />

obtenha o "segundo maior valor" do vetor, excluímos o "primeiro maior valor" atribuindo a esta componente<br />

um valor sabidamente menor do que todos os valores armazenados no vetor. Por ex<strong>em</strong>plo, se os valores do<br />

vetor são positivos pode-se atribuir -1 a cada componente já selecionada e já armazenada no vetor auxiliar.<br />

Para ex<strong>em</strong>plificar o método, vamos ordenar o vetor v = {5, 2, 7, 1, 8}. Basta percorrer o vetor 5 vezes<br />

selecionando sucessivamente 8, 7, 5, 2 e 1 e realizando as seguintes atribuições:<br />

1. Aux = { , , , , 8}<br />

v = {5, 2, 7, 1, -1}<br />

2. Aux = { , , , 7, 8}<br />

v = {5, 2, -1, 1, -1}<br />

3. Aux = { , , 5, 7, 8}<br />

v = {-1, 2, -1, 1, -1}<br />

4. Aux = { , 2, 5, 7, 8}<br />

v = {-1, -1, -1, 1, -1}<br />

5. Aux = {1, 2, 5, 7, 8}<br />

v = {-1, -1, -1, -1, -1},<br />

Para finalizar, basta armazenar nas componentes de v as componentes de Aux.<br />

void MaiorEl<strong>em</strong>ento(int *v, int t, int &m, int &p)<br />

{<br />

int i, Pos;<br />

m = v[0];<br />

Pos = 0;<br />

for (i = 1; i < t; i = i + 1)<br />

if (v[i] > m)<br />

{<br />

m= v[i];<br />

Pos = i;<br />

}<br />

p = Pos;<br />

}<br />

void SelectSort(int *v, int t)<br />

{<br />

int i, Pos, Aux[500];<br />

for(i = 0; i < t; i = i + 1)<br />

{<br />

MaiorEl<strong>em</strong>ento(v, t, Aux[t - 1 - i], Pos);<br />

v[Pos] = -1;<br />

}<br />

for (i = 0; i < t; i = i + 1)<br />

v[i] = Aux[i];<br />

}<br />

Observe que, como o parâmetro m é passado por referência, a função MaiorEl<strong>em</strong>ento() já armazena no<br />

vetor Aux os maiores el<strong>em</strong>entos de v, nas suas posições definitivas.<br />

Há uma outra versão do SelectSort que prescinde de um vetor auxiliar. Se o vetor contém k<br />

componentes, esta versão consiste <strong>em</strong> se comparar a maior dentre as k - 1 primeiras componentes com a<br />

componente de ord<strong>em</strong> k, permutando-se suas posições se aquela maior componente for menor do que esta<br />

última. Esta operação coloca o maior el<strong>em</strong>ento na última posição do vetor, como desejado. Este raciocínio é<br />

repetido no vetor das k - 1 primeiras componentes e assim sucessivamente.<br />

void SelectSortVersao2(int *v, int t)<br />

{<br />

int Pos, k, m;<br />

k = t - 1;<br />

while (k > 0)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!