Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ordenar array ???? (https://www.clubdelphi.com/foros/showthread.php?t=17754)

burasu 20-01-2005 13:40:44

Ordenar array ????
 
Hola amigos, tengo un array de 4 valores relleno de datos no ordenados, por ejemplo [2,8,4,1]

necesito volcarlos en otro array de registros de una forma ordenada de menor a mayor, quedando así [1,2,4,8].

Tengo el problema de que si el array original es por ejemplo [2,0,4,1] el resultado de ese ordenamiento de array no debe ser [0,1,2,4], sino [1,2,4,0], es decir, me debe ordenar los valores de forma que los primeros sean los valores ordenados y los últimos digitos aquellos que sean cero.

He consultado en el foro y no veo una consulta parecida, y me está dando un verdadero quebradero por que no veo la lógica para poder generar el ordenamiento.

Gracias de antemano.

__hector 20-01-2005 14:18:45

Metodo burbuja (busca el algoritmo, seguro lo consigues incluso escrito en pascal). Se trata de recorrer el arreglo e ir organizando sus valores. Una modificacion seria condicionar el if de la decisicion para tratar de forma especial los ceros

burasu 20-01-2005 15:50:09

Ok Hector gracias por el consejo ;)

roman 20-01-2005 16:18:54

Cita:

Empezado por hector
seguro lo consigues incluso escrito en pascal

Y sin ir más lejos, en los demos que vienen con Delphi está el del uso de hilos (threads) donde vienen tres métodos distintos para ordenamiento.

// Saludos

Albano 20-01-2005 18:27:34

Codigo (array de 10 numeros)
 
Hice un programa para ordenar de la manera que tu pediste un array de 10 elementos, espero te sirva.

procedure TForm1.BtnOrdenarClick(Sender: TObject);


var
x, y, tot, aux: integer;


begin
tot := 10; //tot es la variable que me dice cuantos de los

for x := 1 to tot - 1 do //numeros del arreglo no son 0


begin
if vec[x] = 0 then



begin
for y := x to tot - 1 do //se recorren todos los valores una unidadvec[y] := vec[y+1]; //hacia atras
vec[tot] := 0; //a la ultima posicion se le da valor de cero
dec(tot);

end;


end;

for x := 1 to tot do //Metodo de burbuja


begin
for y := 1 to tot - 1 do



begin
if vec[y] > vec[y+1] then



begin
aux := vec[y];

vec[y] := vec[y+1];
vec[y+1] := aux;

end;


end;


end;


end;

burasu 20-01-2005 18:59:23

Muchas gracias Albano.

Salu2

focosoft 15-02-2007 20:39:16

Tambien me sirvió tu ejemplo
 
Aún despues de que ya tiene rato que publicaste tu consejo, me sirvió para ordenar fechas, te dejo lo que arreglé:

La variable tot, la declaré publica y el objetivo es explorar una serie de nombres de archivo los cuales están guardados con un mombre de fecha, la intención es extraer el nombre del archivo, acomodarlo por fecha en un combo list box y para eso necesité de tu método burbuja., gracias. :D


procedure TForm1.Button3Click(Sender: TObject);
var
SearchRec: TSearchRec;
archivo : string;
x, y :integer;
aux : TDateTime;
vec: array[0..500] of TdateTime;
begin
tot:=0;
if psvBrowseFolderDialog1.Execute then
begin
Memo2.Clear;
SB1.SimpleText:=psvBrowseFolderDialog1.FolderName;
archivo:='';
CLB1.Clear;
if FindFirst(psvBrowseFolderDialog1.FolderName+'\*.01', faAnyFile and not
(faVolumeID or faDirectory), SearchRec) = 0 then
begin
repeat

archivo:=SearchRec.Name;
tot:=tot+1;
vec[tot]:=StrToDate(archivo[3]+archivo[4]+'/'+archivo[5]+archivo[6]+'/'+archivo[7]+archivo[8])
//CLB1.Items.Add(archivo[3]+archivo[4]+'/'+archivo[5]+archivo[6]+'/'+archivo[7]+archivo[8]);
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
///MÉTODO BURBUJA PARA ARREGLAR FECHAS ///////////

tot2 := tot; //tot es la variable que me dice cuantos de los
for x := 1 to tot - 1 do //numeros del arreglo no son 0
begin
if vec[x] = 0 then
begin
for y := x to tot - 1 do //se recorren todos los valores una unidadvec[y] := vec[y+1]; //hacia atras
vec[tot] := 0; //a la ultima posicion se le da valor de cero
dec(tot);
end;
end;
for x := 1 to tot do //Metodo de burbuja
begin
for y := 1 to tot - 1 do
begin
if vec[y] > vec[y+1] then
begin
aux := vec[y];
vec[y] := vec[y+1];
vec[y+1] := aux;
end;
end;
end;

////////////////////////////////////////////////
//FOR PARA INSETAR EN CLB1///////////////
for x:=1 to tot2 do
begin
CLB1.Items.Add(DateToStr(vec[x]));
end;
///////////////

end;
end;


La franja horaria es GMT +2. Ahora son las 10:40:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi