algorithms-for-computing-li.../src/main/java/Presenter/FastElementSelector.java

90 lines
1.9 KiB
Java

package Presenter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
/**
* Created by armin on 29.06.17.
*/
public class FastElementSelector {
/**
*
* @param a
* @param i
* @return
*/
public static Double randomizedSelect(ArrayList<Double> a, double i) {
int start = 0;
int end = a.size()-1;
if (i >= end+1){
return a.get(end);
}
while(true){
if(start == end){
return a.get(start);
}
int q = randomizedPartition(a, start, end);
int k = q-start+1;
if(i == k){
return a.get(q);
}
else{
if(i <k){
end = q - 1;
}else{
i = i - k;
start = q + 1;
}
}
}
}
/**
*
* @param a
* @param start
* @param end
* @return
*/
private static int randomizedPartition(ArrayList<Double> a, int start, int end) {
int i = 0;
Random random = new Random(System.currentTimeMillis());
//alternative: ThreadLocalRandom.current()
if(start < end){
i = start + random.nextInt(end-start);
}else{
i = end + random.nextInt(start-end);
}
Collections.swap(a, end, i);
return partition(a, start, end);
}
/**
*
* @param a
* @param start
* @param end
* @return
*/
private static int partition(ArrayList<Double> a, int start, int end) {
Double x = a.get(end);
int i = start - 1;
for (int j = start; j <= end-1; j++) {
if (a.get(j) <= x) {
i++;
Collections.swap(a, i, j);
}
}
Collections.swap(a, i+1, end);
return i+1;
}
}