home *** CD-ROM | disk | FTP | other *** search
- {
- >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: ...
-
- Stop the presses, stop the presses!
-
- Remember the recent Integer sort contest, on the Intelec Programming
- conference? The fastest method was a "counting" sort technique, which
- used the Integers (to be sorted) as indexes of an Array.
-
- You asked John Kuhn how it worked, as his example code was in messy
- C. I sent you an explanation, along With example TP source. Around
- that time my link to Intelec was intermittently broken; I didn't
- hear back from you - so you may not have received my message (dated
- Jan.02.1993). I hope you won't mind if I re-post it here and now...
-
- In a message With John Kuhn...
- > Simply toggle the sign bit of the values beFore sorting. Everything
- > falls into place appropriately from there.
- > ...OK, but how about toggling them back to their original
- > state AFTER sorting? (I want to maintain negative numbers)
- > How can you tell which data elements are negative numbers???
-
- Hi Guy,
-
- if you've got all of this under your belt, then please disregard
- the following explanation ...
-
- By toggling the high bit, the Integers are changed in a way that,
- conveniently, allows sorting by magnitude: from the "most negative"
- to "most positive," left to right, using an Array With unsigned
- indexes numbering 0...FFFFh. The Array size represents the number
- of all possible (16-bit) Integers... -32768 to 32767.
-
- The "Count Sort" involves taking an Integer, toggling its high bit
- (whether the Integer is originally positive or negative), then
- using this tweaked value as an index into the Array. The tweaked
- value is used only as an Array index (it becomes an unsigned
- index somewhere within 0..FFFFh, inclusive).
-
- The Array elements, which are initialized to zero, are simply the
- counts of the _occurrences_ of each Integer. The original Integers,
- With proper sign, are _derived_ from the indexes which point to
- non-zero elements (after the "sort")... ie. an original Integer is
- derived by toggling the high bit of a non-zero element's index.
-
- Array elements of zero indicate that no Integer of the corresponding
- (derived) value was encountered, and can be ignored. if any element
- is non-zero, its index is used to derive the original Integer. if
- an Array element is greater than one (1), then the corresponding
- Integer occurred more than once.
-
- A picture is worth 1000 Words: The following simplified example
- sorts some negative Integers. The entire Count Sort is done by
- a Single For-do-inC() loop - hence its speed. The xors do the
- required high-bit toggling ...
- }
-
-
- Program DemoCountSort; { Turbo Pascal Count Sort. G.Vigneault }
-
- { some negative Integers to sort ... }
- Const
- SomeNegs : Array [0..20] of Integer =
- (-2,-18,-18,-20000,-100,-10,-8,-11,-5,
- -1300,-17,-1,-16000,-4,-12,-15,-19,-1,
- -31234,-6,-7000 );
-
- { pick an Array to acComplish Count Sort ... }
- Var
- NegNumArray : Array [$0000..$7FFF] of Byte;
- { PosNumArray : Array [$8000..$FFFF] of Byte; }
- { AllNumArray : Array [$0000..$FFFF] of Byte; use heap }
- Index : Word;
- IntCount : Byte;
-
- begin
- { Initialize }
- FillChar( NegNumArray, Sizeof(NegNumArray), 0 );
-
- { Count Sort (the inC does this) ... }
-
- For Index := 0 to 20 do
- { Just 21 negative Integers to sort }
- inC( NegNumArray[ Word(SomeNegs[Index] xor $8000) ]);
-
- { then display the sorted Integers ... }
- For Index := 0 to $7FFF do
- { Check each Array element }
- For IntCount:= 1 to NegNumArray[Index] do
- { For multiples }
- WriteLn( Integer(Index xor $8000) ); { derive value }
-
- end { DemoCountSort }.