public class QuickSelect
extends java.lang.Object
This algorithm is essentially an incomplete QuickSort that only descends into that part of the data that we are interested in, and also attributed to Charles Antony Richard Hoare.
If you want to use this with a Comparable
type, use the natural
comparator Comparator.naturalOrder()
. You can wrap arrays as lists
with java.util.Arrays#asList
, to sort them in-place, or implement
an QuickSelect.Adapter
for your data structure.
Modifier and Type | Class and Description |
---|---|
static interface |
QuickSelect.Adapter<T>
Adapter class to apply QuickSelect to arbitrary data structures.
|
Modifier and Type | Field and Description |
---|---|
static QuickSelect.Adapter<byte[]> |
BYTE_ADAPTER
Adapter for byte arrays.
|
static QuickSelect.Adapter<char[]> |
CHAR_ADAPTER
Adapter for char arrays.
|
static QuickSelect.Adapter<double[]> |
DOUBLE_ADAPTER
Adapter for double arrays.
|
static QuickSelect.Adapter<float[]> |
FLOAT_ADAPTER
Adapter for float arrays.
|
static QuickSelect.Adapter<int[]> |
INTEGER_ADAPTER
Adapter for integer arrays.
|
static QuickSelect.Adapter<long[]> |
LONG_ADAPTER
Adapter for long arrays.
|
static QuickSelect.Adapter<short[]> |
SHORT_ADAPTER
Adapter for short arrays.
|
private static int |
SMALL
For small arrays, use a simpler method:
|
Modifier | Constructor and Description |
---|---|
private |
QuickSelect()
Do not instantiate - static methods only!
|
Modifier and Type | Method and Description |
---|---|
private static int |
bestPivot(int rank,
int m1,
int m2,
int m3,
int m4,
int m5)
Choose the best pivot for the given rank.
|
private static void |
insertionSort(double[] data,
int start,
int end)
Sort a small array using repetitive insertion sort.
|
private static <T> void |
insertionSort(java.util.List<T> data,
java.util.Comparator<? super T> comparator,
int start,
int end)
Sort a small array using repetitive insertion sort.
|
private static <T> void |
insertionSort(T data,
QuickSelect.Adapter<T> adapter,
int start,
int end)
Sort a small array using repetitive insertion sort.
|
static double |
median(double[] data)
Compute the median of an array efficiently using the QuickSelect method.
|
static double |
median(double[] data,
int begin,
int end)
Compute the median of an array efficiently using the QuickSelect method.
|
static <T> T |
median(java.util.List<? extends T> data,
java.util.Comparator<? super T> comparator)
Compute the median of an array efficiently using the QuickSelect method.
|
static <T> T |
median(java.util.List<? extends T> data,
java.util.Comparator<? super T> comparator,
int begin,
int end)
Compute the median of an array efficiently using the QuickSelect method.
|
static double |
quantile(double[] data,
double quant)
Compute the median of an array efficiently using the QuickSelect method.
|
static double |
quantile(double[] data,
int begin,
int end,
double quant)
Compute the median of an array efficiently using the QuickSelect method.
|
static <T> T |
quantile(java.util.List<? extends T> data,
java.util.Comparator<? super T> comparator,
double quant)
Compute the median of an array efficiently using the QuickSelect method.
|
static <T> T |
quantile(java.util.List<? extends T> data,
java.util.Comparator<? super T> comparator,
int begin,
int end,
double quant)
Compute the median of an array efficiently using the QuickSelect method.
|
static double |
quickSelect(double[] data,
int rank)
QuickSelect is essentially quicksort, except that we only "sort" that half
of the array that we are interested in.
|
static double |
quickSelect(double[] data,
int start,
int end,
int rank)
QuickSelect is essentially quicksort, except that we only "sort" that half
of the array that we are interested in.
|
static <T> T |
quickSelect(java.util.List<? extends T> data,
java.util.Comparator<? super T> comparator,
int rank)
QuickSelect is essentially quicksort, except that we only "sort" that half
of the array that we are interested in.
|
static <T> void |
quickSelect(java.util.List<? extends T> data,
java.util.Comparator<? super T> comparator,
int start,
int end,
int rank)
QuickSelect is essentially quicksort, except that we only "sort" that half
of the array that we are interested in.
|
static <T> void |
quickSelect(T data,
QuickSelect.Adapter<T> adapter,
int start,
int end,
int rank)
QuickSelect is essentially quicksort, except that we only "sort" that half
of the array that we are interested in.
|
private static void |
swap(double[] data,
int a,
int b)
The usual swap method.
|
private static <T> void |
swap(java.util.List<T> data,
int a,
int b)
The usual swap method.
|
private static final int SMALL
public static QuickSelect.Adapter<double[]> DOUBLE_ADAPTER
public static QuickSelect.Adapter<int[]> INTEGER_ADAPTER
public static QuickSelect.Adapter<float[]> FLOAT_ADAPTER
public static QuickSelect.Adapter<short[]> SHORT_ADAPTER
public static QuickSelect.Adapter<long[]> LONG_ADAPTER
public static QuickSelect.Adapter<byte[]> BYTE_ADAPTER
public static QuickSelect.Adapter<char[]> CHAR_ADAPTER
private static final int bestPivot(int rank, int m1, int m2, int m3, int m4, int m5)
rank
- Rankm1
- Pivot candidatem2
- Pivot candidatem3
- Pivot candidatem4
- Pivot candidatem5
- Pivot candidatepublic static <T> void quickSelect(T data, QuickSelect.Adapter<T> adapter, int start, int end, int rank)
data
- Data to processstart
- Interval startend
- Interval end (exclusive)rank
- rank position we are interested in (starting at 0)private static <T> void insertionSort(T data, QuickSelect.Adapter<T> adapter, int start, int end)
data
- Data to sortstart
- Interval startend
- Interval endpublic static double quickSelect(double[] data, int rank)
data
- Data to processrank
- Rank position that we are interested in (integer!)public static double median(double[] data)
data
- Data to processpublic static double median(double[] data, int begin, int end)
data
- Data to processbegin
- Begin of valid valuesend
- End of valid values (exclusive!)public static double quantile(double[] data, double quant)
data
- Data to processquant
- Quantile to computepublic static double quantile(double[] data, int begin, int end, double quant)
data
- Data to processbegin
- Begin of valid valuesend
- End of valid values (exclusive!)quant
- Quantile to computepublic static double quickSelect(double[] data, int start, int end, int rank)
data
- Data to processstart
- Interval startend
- Interval end (exclusive)rank
- rank position we are interested in (starting at 0)private static void insertionSort(double[] data, int start, int end)
data
- Data to sortstart
- Interval startend
- Interval endprivate static final void swap(double[] data, int a, int b)
data
- Arraya
- First indexb
- Second indexprivate static final <T> void swap(java.util.List<T> data, int a, int b)
T
- object typedata
- Arraya
- First indexb
- Second indexpublic static <T> T quickSelect(java.util.List<? extends T> data, java.util.Comparator<? super T> comparator, int rank)
T
- object typedata
- Data to processcomparator
- Comparator to userank
- Rank position that we are interested in (integer!)public static <T> T median(java.util.List<? extends T> data, java.util.Comparator<? super T> comparator)
T
- object typedata
- Data to processcomparator
- Comparator to usepublic static <T> T median(java.util.List<? extends T> data, java.util.Comparator<? super T> comparator, int begin, int end)
T
- object typedata
- Data to processcomparator
- Comparator to usebegin
- Begin of valid valuesend
- End of valid values (exclusive!)public static <T> T quantile(java.util.List<? extends T> data, java.util.Comparator<? super T> comparator, double quant)
T
- object typedata
- Data to processcomparator
- Comparator to usequant
- Quantile to computepublic static <T> T quantile(java.util.List<? extends T> data, java.util.Comparator<? super T> comparator, int begin, int end, double quant)
T
- object typedata
- Data to processcomparator
- Comparator to usebegin
- Begin of valid valuesend
- End of valid values (inclusive!)quant
- Quantile to computepublic static <T> void quickSelect(java.util.List<? extends T> data, java.util.Comparator<? super T> comparator, int start, int end, int rank)
T
- object typedata
- Data to processcomparator
- Comparator to usestart
- Interval startend
- Interval end (inclusive)rank
- rank position we are interested in (starting at 0)private static <T> void insertionSort(java.util.List<T> data, java.util.Comparator<? super T> comparator, int start, int end)
T
- object typedata
- Data to sortstart
- Interval startend
- Interval endCopyright © 2019 ELKI Development Team. License information.