Find Nth largest element in an array


Recently, I was asked to write the algorithm for finding nth largest item in an array.

Finding the max is easy:

public class Main
{

    public static void main(String[] args)
    {
        int array[] =
        { 10, 20, 30, 25, 50, 55, 90, 10, 20, 30 };

        int max = 0;
        for (int i = 0; i < array.length; ++i)
        {
            if (max < array[i])
                max = array[i];

        }

        System.out.println("The Max is: " + max);

        if (System.console() != null)
            System.console().readLine();

    }
}
The Max is: 90

However, finding the nth largest is bit complicated. It uses the quick select algorithm with complexity O(n)

public class Main
{

    public static void main(String[] args)
    {
        int array[] =
        { 10, 20, 30, 25, 50, 55, 90, 80, 70, 10, 20, 30 };

        System.out
                .println("The Max is: " + kthLargest(array, array.length - 1));

        System.out.println("The next Max is: "
                + kthLargest(array, array.length - 2));

        if (System.console() != null)
            System.console().readLine();

    }

    static int kthLargest(int[] list, int k)
    {
        int left = 0;
        int right = list.length - 1;
        while (true)
        {
            int pivIndex = (left + right) / 2;
            int newPiv = partition(list, left, right, pivIndex);
            if (newPiv == k)
                return list[newPiv];
            else if (newPiv < k)
            {
                left = newPiv + 1;
            }
            else
            {
                right = newPiv - 1;
            }
        }
    }

    private static int partition(int[] list, int left, int right, int pivot)
    {
        int pivValue = list[pivot];
        swap(list, pivot, right); // put pivot value on the end
        int storePos = left;
        for (int i = left; i < right; i++)
        {
            if (list[i] < pivValue)
            {
                swap(list, i, storePos);
                storePos++;
            }
        }
        swap(list, storePos, right);
        return storePos;
    }

    private static void swap(int[] list, int a, int b)
    {
        int temp = list[a];
        list[a] = list[b];
        list[b] = temp;

    }
}

The Max is: 90
The next Max is: 80