Java Reference
In-Depth Information
15.4.1
Algorithm partition
Algorithm
quicksort
rests heavily on algorithm
partition
, which is discussed
in detail in activity 8-5.5 of the
ProgramLive
CD. In learning
quicksort
, it is
important that you understand what
partition
does, if not how it does it. We
explain it with an example. Here is its specification:
Activity 8-5.5
discusses algo-
rithm partition.
A footnote tells
you how to get
it from the CD.
/** b[h..k]
has at least three elements. Let
x
be the value initially
in b[h]
. Permute
b[h..k]
and return the integer
j
satisfying
R
:
b[h..j-1] ≤ b[j] = x ≤ b[j+1..k] */
public static int
partition(
int
[] b,
int
h,
int
k)
Here is an example. Suppose
b[h..k]
contains:
h k
5 4 8 7 5 2
The value in
b[h]
is called the
pivot
value. The call
partition(b, h, k)
rearranges
b[h..k]
to put elements smaller than the pivot value to its left and
larger elements to its right. But the arrangement of the values in the two seg-
ments is not specified. Also, the placement of elements that are equal to the pivot
value is not specified. We say that the specification is
nondeterministi
because
different implementations can give different results and still satisfy the specifi-
cation. In this case, there are several possibilities for the final arrangement of the
array segment, two of which are shown here:
h j k
2 4 5 7 5 8
h j k
4 2 5 5 7 8
The value
j
of the index of the pivot element
b[j]
is returned.
The specification of this function is nondeterministic. Since we do not care
about the order of values in the two final segments
b[h..j-1]
and
b[j+1..k]
,
function partition can be written to take time proportional to the number of ele-
ments,
k+1-h
. It makes up to
k+1-h
array comparisons.
15.4.2
Basic quicksort
We turn to procedure
quicksort
:
Activity
15-4.1
/**
Sort
b[h..k] */
public static void
quicksort(
int
[] b,
int
h,
int
k)
We take as the base case an array segment with fewer than
10
elements. In
this case, the array segment is sorted using
insertionsort
. Experiments have
shown that this base case is efficient. Procedure
quicksort
is fast on large seg-
ments but relatively slow on small ones.
Consider the case of an array segment with at least
10
elements. Partitioning
Search WWH ::
Custom Search