public void Sort(int[] a, int l, int h)
 {
     if (l < h)
     {
         int rp = Helper.RandomPartition(a, l, h);
         Sort(a, l, rp - 1);
         Sort(a, rp + 1, h);
     }
 }
 private int KthLargestHelper(int[] a, int l, int h, int k)
 {
     while (l <= h)
     {
         int rp = Helper.RandomPartition(a, l, h);
         if (rp == k)
         {
             return(rp);
         }
         if (rp > k)
         {
             return(KthLargestHelper(a, l, rp, k));
         }
         else
         {
             return(KthLargestHelper(a, rp + 1, h, k));
         }
     }
     return(-1);
 }
 private int KthSmallestHelper(int[] a, int l, int h, int k)
 {
     if (l <= h)
     {
         int rp = Helper.RandomPartition(a, l, h);
         if (rp == k)
         {
             return(rp);
         }
         if (rp > k)
         {
             // Search left
             return(KthSmallestHelper(a, l, rp - 1, k));
         }
         else
         {
             return(KthSmallestHelper(a, rp + 1, h, k - rp));
         }
     }
     return(-1);
 }