home *** CD-ROM | disk | FTP | other *** search
- const max = 1000; {max array size}
- type standardarray = array[0..max] of string[8];
- type pointarray = array[0..max] of integer;
- var words : standardarray; {numeric array}
- pointer : pointarray;
- last,i : integer;
-
-
- procedure swap( var a,b: integer );
- var t: integer;
- begin
- t := a;
- a := b;
- b := t
- end;
-
-
- procedure bsort( start, top: integer;
- var arry: standardarray;
- var pointer: pointarray );
- {bubble sort procedure. sorts array from start to top inclusive}
- var index: integer;
- switched: boolean;
- begin {bsort}
- repeat
- switched := false;
- for index := start to top-1 do
- begin
- if arry[pointer[index]] > arry[pointer[index+1]] then
- begin
- swap( pointer[index], pointer[index+1] );
- switched := true;
- end
- end;
- until switched = false;
- end; {bsort}
-
- procedure findmedian( start, top: integer;
- var arry: standardarray;
- var pointer : pointarray );
- {procedure to find a good median value in array and place it}
- var middle: integer;
- sorted: standardarray;
- begin {findmedian}
- middle := (start + top) div 2;
- sorted[1] := arry[pointer[start]];
- sorted[2] := arry[pointer[top]];
- sorted[3] := arry[pointer[middle]];
-
- if (sorted[2] > sorted[1]) and (sorted[2] < sorted[3]) then
- swap( pointer[start], pointer[middle] )
- else if (sorted[3] > sorted[1]) and (sorted[3] < sorted[2]) then
- swap( pointer[start], pointer[top] );
- end; {findmedian}
-
- procedure sortsection( start, top: integer;
- var arry: standardarray;
- var pointer : pointarray);
- {procedure to sort a section of the main array, and }
- {then divide it into two partitions to be sorted }
- var swapup: boolean;
- s,e,m: integer;
- begin {sortsection}
- if top - start < 6 then {sort small sections with bsort}
- bsort( start, top, arry , pointer )
- else
- begin
- findmedian( start, top, arry , pointer );
- swapup := true;
- {start scanning from array top}
- s := start; {lower comparison limit}
- e := top; {upper comparison limit}
- m := start; {location of comparison value}
- while e > s do
- begin
- if swapup = true then
- {scan downward from partition top}
- {and exchange if smaller than median}
- begin
- while( arry[pointer[e]] >= arry[pointer[m]] )
- and (e > m) do
- e := e - 1;
- if e > m then
- begin
- swap( pointer[e], pointer[m] );
- m := e;
- end;
- swapup := false;
- end
- else
- {scan upward from a partition start}
- {and exchange if larger than median}
- begin
- while( arry[pointer[s]] <= arry[pointer[m]] )
- and (s < m) do
- s := s + 1;
- if s < m then
- begin
- swap( pointer[s], pointer[m] );
- m := s;
- end;
- swapup := true;
- end
- end;
- {sort lower half of partition}
- sortsection( start, m-1, arry , pointer );
- {sort upper half of partition}
- sortsection( m+1, top, arry , pointer);
- end
- end; {sortsection}
-
- begin {qsort - main program}
- for i := 1 to max do
- pointer[i] := i;
-
- sortsection( 1, max , words , pointer );
- end. {qsort}