Algoritimo dos 5 maiores no vetor
esto precisando implementar em um de meus sistemas uma função na qual mando um vetor de aproximadamente 150 valores..
e preciso retornar os 5 maiores valores dele..
minha primeira ideia seria:
aux: array[0..4] of double;
for I := 0 to 4 do
begin
maior := 0;
for X := 0 to Total - 1 do
begin
if (vetor[X] >= maior) then
begin
maior := vetor[X];
end
end;
aux[I] := maior;
end;
alguem conhece alguma forma mais rapida de retornar isto??
pos preciso de velocidade..
abraço..
e preciso retornar os 5 maiores valores dele..
minha primeira ideia seria:
aux: array[0..4] of double;
for I := 0 to 4 do
begin
maior := 0;
for X := 0 to Total - 1 do
begin
if (vetor[X] >= maior) then
begin
maior := vetor[X];
end
end;
aux[I] := maior;
end;
alguem conhece alguma forma mais rapida de retornar isto??
pos preciso de velocidade..
abraço..
Nightshade
Curtidas 0
Respostas
Acacio
03/05/2007
Tens que ordenar o vetor primeiramente, Existe o método da bolha que faz isso, depois é só pegar os cinco maiores.
Método da bolha mais ou menos
for i := 1 to high(vetor) do
for j := i to high(vetor) do
if vetor[i] < vetor[j] then
begin
varAux := vetor[i];
vetor[i] := vetor[j];
vetor[j] := varAux
end;
mais ou menos isso;
Método da bolha mais ou menos
for i := 1 to high(vetor) do
for j := i to high(vetor) do
if vetor[i] < vetor[j] then
begin
varAux := vetor[i];
vetor[i] := vetor[j];
vetor[j] := varAux
end;
mais ou menos isso;
GOSTEI 0
Rjun
03/05/2007
Procure na internet sobre o algoritmo quicksort.
GOSTEI 0
Motta
03/05/2007
Veja este site , talvez ajude
http://www.nist.gov/dads/
http://www.nist.gov/dads/
GOSTEI 0
Nightshade
03/05/2007
procedure Destaques(S: TListBox; L: TListView);
var
X,Y,Z: Integer;
ListaV, ListaN: TStringList;
Maior,MAux,Atual: Double;
MCorret: String;
begin
// try
L.Items.Clear;
ListaV := TStringList.Create;
ListaN := TStringList.Create;
Maior := 0;
MAux := 1000000000000;
//Verifica os 5 maiores
for Y := 0 to 4 do
begin
//Ordena Internamente
Maior := 0;
for Z := 0 to S.Items.Count -1 do
begin
Atual := (StrToFloat(S.Items.Strings[Z]));
if ((Atual <= MAux) and (Atual >= Maior)) then
begin
Maior := StrToFloat(S.Items.Strings[Z]);
MCorret := IntToStr(Z + 1);
end;
end;
MAux := Maior;
with L.Items.Add do
begin
Caption := IntToStr(Y + 1);
SubItems.Add(MCorret);
SubItems.Add(FloatToStr(Maior));
end;
end;
// except
//
// end;
end;
to tentando com esta função..
o stringbox eh temporario, eh so pra teste q to usando ele, mais tarde sera um stringlist.. mas n importa :p
o problema que está ocorrendo é que ele retorna 5X o mesmo valor, que realmente eh o maior da lista..
var
X,Y,Z: Integer;
ListaV, ListaN: TStringList;
Maior,MAux,Atual: Double;
MCorret: String;
begin
// try
L.Items.Clear;
ListaV := TStringList.Create;
ListaN := TStringList.Create;
Maior := 0;
MAux := 1000000000000;
//Verifica os 5 maiores
for Y := 0 to 4 do
begin
//Ordena Internamente
Maior := 0;
for Z := 0 to S.Items.Count -1 do
begin
Atual := (StrToFloat(S.Items.Strings[Z]));
if ((Atual <= MAux) and (Atual >= Maior)) then
begin
Maior := StrToFloat(S.Items.Strings[Z]);
MCorret := IntToStr(Z + 1);
end;
end;
MAux := Maior;
with L.Items.Add do
begin
Caption := IntToStr(Y + 1);
SubItems.Add(MCorret);
SubItems.Add(FloatToStr(Maior));
end;
end;
// except
//
// end;
end;
to tentando com esta função..
o stringbox eh temporario, eh so pra teste q to usando ele, mais tarde sera um stringlist.. mas n importa :p
o problema que está ocorrendo é que ele retorna 5X o mesmo valor, que realmente eh o maior da lista..
GOSTEI 0
Marco Salles
03/05/2007
amigo , pode parecer deselegante , mas eu faria teste simples com If Aninhados...Afinal o que se quer saber são os cincos maiores valores do vetor...
Sinceramente não vejo muito o que se ganha em ordenar 150 posiçoes , enquanto que por outro lado so se precisa é de reogarnizar as vezes cinco , quatro , tres , duas , uma ou nenhuma posição do vetor Aux
var i:integer; num:Double; aux: array[1..5] of double ; vetor: array [1..150] of double ; begin //claro que aqui devo carregar o aux=[0,0,0,0,0] for i := 1 to high(vetor) do begin num:=vetor[i]; if vetor[i] > aux[1] then begin aux[5]:=aux[4]; aux[4]:=aux[3]; aux[3]:=aux[2]; aux[2]:=aux[1]; aux[1]:=num; end else if vetor[i] > aux[2] then begin aux[5]:=aux[4]; aux[4]:=aux[3]; aux[3]:=aux[2]; aux[2]:=num; end else if vetor[i] > aux[3] then begin aux[5]:=aux[4]; aux[4]:=aux[3]; aux[3]:=num; end else if vetor[i] > aux[4] then begin aux[5]:=aux[4]; aux[4] :=num end else if vetor[i] > aux [5] then aux[5]:=num; end; end;
Sinceramente não vejo muito o que se ganha em ordenar 150 posiçoes , enquanto que por outro lado so se precisa é de reogarnizar as vezes cinco , quatro , tres , duas , uma ou nenhuma posição do vetor Aux
GOSTEI 0
Marco Salles
03/05/2007
Deixe eu so apresentar outra forma , de apresentar estes If Aninhados , antes que algume o faça
Uma forma mais elegante seria
Uma forma mais elegante seria
var i,j,p:integer; num:Double; aux: array[1..5] of double ; begin for i := 1 to high(vetor) do begin num:=vetor[i]; for j := 1 to 5 do begin if vetor[i] > aux [j] then begin for p:=5 downto j do aux[p]:=aux[p-1]; aux[j]:=num; Break; end; end; end;
GOSTEI 0
Nightshade
03/05/2007
quando eu postei que a identação se perdeu, eu nao to acostumado com essa codificação do forum..
GOSTEI 0
Marco Salles
03/05/2007
Desculpe-me mas fiquei sem entender ????
[b:fb92ebda95]citação de nightshade[/b:fb92ebda95]
[b:fb92ebda95]citação de nightshade[/b:fb92ebda95]
quando eu postei que a identação se perdeu, eu nao to acostumado com essa codificação do forum..
GOSTEI 0