[Back to SORTING SWAG index]  [Back to Main SWAG index]  [Original]

{
>I'm in need of a FAST way of finding the largest and the smallest
>30 numbers out of about 1000 different numbers.

  ...Assuming that the 1000 numbers are in random-order, I imagine
  that the simplest (perhaps fastest too) method would be to:

    1- Read the numbers in an Array.

    2- QuickSort the Array.

    3- First 30 and last 30 of Array are the numbers you want.

  ...Here's a QuickSort demo Program that should help you With the
  sort:
}

{$A+,B-,D-,E-,F-,I-,L-,N-,O-,R-,S+,V-}
{$M 60000,0,0}

Program QuickSort_Demo;
Uses
  Crt;

Const
  co_MaxItem = 30000;

Type
  Item    = Word;
  ar_Item = Array[1..co_MaxItem] of Item;


  (***** QuickSort routine.                                           *)
  (*                                                                  *)
Procedure QuickSort({update} Var ar_Data  : ar_Item;
                    {input }     wo_Left,
                                 wo_Right : Word);
Var
  Pivot,
  TempItem  : Item;
  wo_Index1,
  wo_Index2 : Word;
begin
  wo_Index1 := wo_Left;
  wo_Index2 := wo_Right;
  Pivot := ar_Data[(wo_Left + wo_Right) div 2];
  Repeat
    While (ar_Data[wo_Index1] < Pivot) do
      inc(wo_Index1);
    While (Pivot < ar_Data[wo_Index2]) do
      dec(wo_Index2);
    if (wo_Index1 <= wo_Index2) then
      begin
        TempItem := ar_Data[wo_Index1];
        ar_Data[wo_Index1] := ar_Data[wo_Index2];
        ar_Data[wo_Index2] := TempItem;
        inc(wo_Index1);
        dec(wo_Index2)
      end
    Until (wo_Index1 > wo_Index2);
    if (wo_Left < wo_Index2) then
      QuickSort(ar_Data, wo_Left, wo_Index2);
    if (wo_Index1 < wo_Right) then
      QuickSort(ar_Data, wo_Index1, wo_Right)
end;        (* QuickSort.                                           *)

Var
  wo_Index  : Word;
  ar_Buffer : ar_Item;

begin
  Write('Creating ', co_MaxItem, ' random numbers... ');
  For wo_Index := 1 to co_MaxItem do
    ar_Buffer[wo_Index] := random(65535);
  Writeln('Finished!');
  Write('Sorting  ', co_MaxItem, ' random numbers... ');
  QuickSort(ar_Buffer, 1, co_MaxItem);
  Writeln('Finished!');
  Writeln;
  Writeln('Press the <ENTER> key to display all ', co_MaxItem,
          ' sorted numbers...');
  readln;
  For wo_Index := 1 to co_MaxItem do
    Write(ar_Buffer[wo_Index]:8)
end.

[Back to SORTING SWAG index]  [Back to Main SWAG index]  [Original]