Nth Element
import java.util.*;
import javafx.util.*;

public class N
{
	public static int nth(int [] array, int p, int r, int i)
	{
		if(p == r)
			return array[p];
		int q = randomPartition(array, p, r);
		int k = q-p+1;
		if(i==k)
			return array[q];
		else if(i < k)
			return nth(array, p, q-1, i);
		else
			return nth(array, p+1, r, i-k);
	}

	public static int randomPartition(int [] array, int p, int r)
	{
		Random ran = new Random();
		int i = ran.nextInt(r-p+1);
		i = p+i;

		int temp = array[r];
		array[r] = array[i];
		array[i] = temp;

		return partition(array, p, r);
	}

	public static int partition(int [] array, int p, int r)
	{
		int pivot = array[r];
		int i = p-1;
		for(int j = p; j < r; j++)
		{
			if(array[j] < pivot)
			{
				i++;
				int temp = array[i];
				array[i] = array[j];
				array[j] = temp;
			}
		}
		int temp = array[i+1];
		array[i+1] = array[r];
		array[r] = temp;

		return i+1;
	}

	public static int [] getArray(int n)
	{
		int [] array = new int[n];
		Random r = new Random();

		for(int i = 0; i < n; i++)
			array[i] = r.nextInt(100);

		return array;
	}

	public static void display(int [] array)
	{
		for(int e : array)
			System.out.printf("%5d", e);
		System.out.println();
	}

	public static void main(String args[])
	{
		int [] array = getArray(100);

		display(array);

		System.out.println("2nd: "+nth(array, 0, array.length-1, 1));
	}
}
			
Reference