package org.streaminer.util;
/**
*
* @author Maycon Viana Bordin <mayconbordin@gmail.com>
*/
public class ArrayUtils {
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static void swap(long[] arr, int a, int b) {
long temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static void swap(double[] arr, int a, int b) {
double temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static int medSelect(int k, int n, int[] arr) {
int i, ir = n, j, mid, l = 1, a;
for (;;) {
if (ir <= l+1) {
if (ir == l+1 && arr[ir] < arr[l]) {
swap(arr, l, ir);
}
return arr[k];
} else {
mid = (l+ir) >> 1;
swap(arr, mid, (l+1));
if (arr[l] > arr[ir]) {
swap(arr, l, ir);
}
if (arr[l+1] > arr[ir]) {
swap(arr, (l+1), ir);
}
if (arr[l] > arr[l+1]) {
swap(arr, l, (l+1));
}
i=l+1;
j=ir;
a=arr[l+1];
for (;;) {
do i++; while (arr[i] < a);
do j--; while (arr[j] > a);
if (j < i) break;
swap(arr, i, j);
}
arr[l+1]=arr[j];
arr[j]=a;
if (j >= k) ir=j-1;
if (j <= k) l=i;
}
}
}
public static long longMedSelect(int k, int n, long[] arr) {
int i, ir = n, j, mid, l = 1;
long a;
for (;;) {
if (ir <= l+1) {
if (ir == l+1 && arr[ir] < arr[l]) {
swap(arr, l, ir);
}
return arr[k];
} else {
mid = (l+ir) >> 1;
swap(arr, mid, (l+1));
if (arr[l] > arr[ir]) {
swap(arr, l, ir);
}
if (arr[l+1] > arr[ir]) {
swap(arr, (l+1), ir);
}
if (arr[l] > arr[l+1]) {
swap(arr, l, (l+1));
}
i=l+1;
j=ir;
a=arr[l+1];
for (;;) {
do i++; while (arr[i] < a);
do j--; while (arr[j] > a);
if (j < i) break;
swap(arr, i, j);
}
arr[l+1]=arr[j];
arr[j]=a;
if (j >= k) ir=j-1;
if (j <= k) l=i;
}
}
}
public static double doubleMedSelect(int k, int n, double[] arr) {
int i, ir = n, j, mid, l = 1;
double a;
for (;;) {
if (ir <= l+1) {
if (ir == l+1 && arr[ir] < arr[l]) {
swap(arr, l, ir);
}
return arr[k];
} else {
mid = (l+ir) >> 1;
swap(arr, mid, (l+1));
if (arr[l] > arr[ir]) {
swap(arr, l, ir);
}
if (arr[l+1] > arr[ir]) {
swap(arr, (l+1), ir);
}
if (arr[l] > arr[l+1]) {
swap(arr, l, (l+1));
}
i=l+1;
j=ir;
a=arr[l+1];
for (;;) {
do i++; while (arr[i] < a);
do j--; while (arr[j] > a);
if (j < i) break;
swap(arr, i, j);
}
arr[l+1]=arr[j];
arr[j]=a;
if (j >= k) ir=j-1;
if (j <= k) l=i;
}
}
}
}