Aprendendo a Programar Programando em Linguagem C - FSM
Aprendendo a Programar Programando em Linguagem C - FSM
Aprendendo a Programar Programando em Linguagem C - FSM
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)