How to find the bigger number.

Hi...

This is easy i guess... I'm just not in thinging mode... right now and i want it fast.

So...
I have 120 integers and i want to find the 3 bigger numbers.
I need a smart way to do this with few lines.

Thanks in advance.
LVL 16
CodedKAsked:
Who is Participating?
 
TheRealLokiConnect With a Mentor Senior DeveloperCommented:
to find the bigger of 2 numbers you can use
uses math;
i := max(j, k);

1 way for you to get the top 3 would be to have the numbers in a sorted list
eg.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, math,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    numberlist: TList;
  end;

var
  Form1: TForm1;

function comparenumbers(Item1, Item2: Pointer): Integer;

implementation

{$R *.DFM}

function comparenumbers(Item1, Item2: Pointer): Integer;
    begin
        if Integer(Item1) < Integer(Item2) then result := -1
        else if Integer(Item1) > Integer(Item2) then result := 1
        else result := 0;
    end;

procedure TForm1.FormCreate(Sender: TObject);
    begin
        numberlist := TList.create;
// add some numbers
        numberlist.add(pointer(10));
        numberlist.add(pointer(8));
        numberlist.add(pointer(2));
        numberlist.add(pointer(7));
        numberlist.add(pointer(9));
        numberlist.add(pointer(1));
        numberlist.add(pointer(3));
    end;

procedure TForm1.FormDestroy(Sender: TObject);
    begin
        numberlist.Free;
    end;

procedure TForm1.Button1Click(Sender: TObject);
    var
        i: integer;
    begin
// make sure the numbers are sorted
        numberlist.Sort(comparenumbers);
// now grab the top 3 numbers and display them
        for i := (numberlist.count -1) downto (numberlist.count -3) do
          memo1.lines.add(inttostr( integer(numberlist[i])));
    end;

end.
0
 
TheRealLokiSenior DeveloperCommented:
I know you said "a few lines" but really it's just "sort" then the for loop :-)
here's a way to do it assuming the get the numbers from somewhere else

procedure TForm1.Button2Click(Sender: TObject);
    var
        sl: TStringList;
        i, value: integer;
        s: string;
    begin
        sl := TStringlist.create;
        try
            sl.sorted := True;
            i := 0; // first index from whatever source of numbers you have
            while (i < numberlist.count) do  // last index from whatever source of numbers you have
            begin
// get the number using index i from your source numbers and convert it to a 10 length padded string
                SL.Add(Format('%10d', [ integer(numberlist[i]) ] )); // if you need bigger numbers, use a number > %10
                inc(i); // go to the next number
            end;
// now grab the top 3 numbers and display them
            for i := (sl.count -1) downto (sl.count -3) do
            begin
                value := StrToInt( sl[i] );
                memo1.lines.add(inttostr( value ));
            end;
        finally
            sl.free;
        end;
    end;
0
 
mokuleConnect With a Mentor Commented:
Not so briliant but possibly faster method.

procedure TForm1.Button1Click(Sender: TObject);
const
  numcount = 100;
var
  intnum: array[0..numcount-1] of integer;
  i: integer;
  b1,b2,b3: integer;
begin
// fill in the array
  for i := 0 to numcount-1 do
    intnum[i] := random(1500);

  if intnum[0] > intnum[1] then
    begin
    b1 := intnum[0];
    b2 := intnum[1];
    end
  else
    begin
    b1 := intnum[1];
    b2 := intnum[0];
    end;
  b3 := intnum[2]-1;

  for i := 3 to numcount-1 do
    begin
    if intnum[i] > b3 then
      begin
      if intnum[i] > b2 then
        begin
        b3 := b2;
        if intnum[i] > b1 then
          begin
          b2 := b1;
          b1 := intnum[i];
          end
        else
          b2 := intnum[i];
        end
      else
        b3 := intnum[i];
      end;
    end;
  Memo1.lines.Add(IntToStr(b1));   // biggest number
  Memo1.lines.Add(IntToStr(b2));   // second biggest
  Memo1.lines.Add(IntToStr(b3));   // third bigest
end;
0
 
CodedKAuthor Commented:
Thank you both.

There is a small problem... I need to know the var that holds the bigger value...
Example : bigger 3 =>(a14, a87, a2)... not only the value.
---------------------------------------------

Since all the numbers will be finally loaded in a Chart maybe there is another way...

X axis represents the variable (a0, a1, a2...a120).

I've loaded all the vars in a TChart !
So with the command :

Chart1.SeriesList.Series[0].MaxYValue; .... i will find the bigger number.

Is there a command for this :
(For this Y which is the X) ???
(And with a for loop decreasing by 1 from the bigger y which is the next bigger y) ?

I hope i make sense.... Thank you very much :)
0
 
CodedKAuthor Commented:
Forget it... Thank you for your time :)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.