Ordenacao - estudos preliminares

Considere dados um inteiro maior que zero N na célula (1,1) da planilha, e N números inteiros dispostos na coluna 2 da planilha, ocupando as células (1,2), (2,2), ..., (N,2).

1. Construa uma função que recebe como parâmetro o valor N e devolve o menor valor encontrado na coluna 2, dentre os valores colocados em (1,2), (2,2), ..., (N,2).

2. Construa uma função que recebe como parâmetros o valor N e um número inteiro U, e devolve o índice correspondente à linha, na coluna 2 da planilha, em que o valor U ocorre pela primeira vez. Se U não ocorrer nenhuma vez na coluna 2, considerando as linhas de 1 a N, então essa função deve devolver o valor 0.

3. Construa um procedimento que recebe como parâmetros dois inteiros I e J, e troca os valores encontrados na coluna 2 da planilha, exatamente nas linhas I e J da planilha.

4. Finalmente, construa um procedimento que utiliza os três procedimentos anteriores, para colocar o menor valor de uma lista fornecida de valores na primeira posição da lista. O valor que estiver ocupando originalmente a primeira posição da lista deve ser deslocado para a posição que originalmente era ocupada pelo menor valor.

Por exemplo, se N = 5 e os valores fornecidos na segunda coluna da planilha forem os valores

7, 3, 4, 1, 8

então a primeira função construída deverá apontar que o menor valor fornecido é o número 1. A segunda função construída, se utilizada com U = 1, deverá apontar que a primeira ocorrência desse valor na seqüência fornecida é na posição 4. Finalmente, se o procedimento for utilizado com I = 1 e J = 4, a seqüência original deve ser alterada, resultando em

1, 3, 4, 7, 8

Questões adicionais:

  • Que condições devem ser atendidas pela seqüência fornecida para esse procedimento conseguir colocar uma série de números em ordem crescente?
  • O que faltaria para esse procedimento conseguir colocar qualquer série de números em ordem crescente?
Function menorNumero(N As Integer) As Integer
Dim i As Integer
Dim menor As Integer
i = 2
menor = Cells(1, 1)
Do While i <= N
    If Cells(i, 1) < menor Then
        menor = Cells(i, 1)
    End If
    i = i + 1
Loop
menorNumero = menor
End Function
Function ondeMenor(N As Integer, U As Integer) As Integer
Dim i As Integer
Dim onde As Integer
onde = 0
i = 1
Do While (i <= N And onde = 0)
    If U = Cells(i, 1) Then
        onde = i
    End If
    i = i + 1
Loop
ondeMenor = onde
End Function
Sub troca(i As Integer, j As Integer)
Dim temp As Integer
temp = Cells(i, 1)
Cells(i, 1) = Cells(j, 1)
Cells(j, 1) = temp
End Sub
Sub arrumaPrimeiro()
Dim menor As Integer
Dim onde As Integer
Dim quant As Integer
quant = Cells(1, 2)
menor = menorNumero(quant)
onde = ondeMenor(quant, menor)
Call troca(1, onde)
End Sub