import random

def quickselect(nums, k, largest=False):
    values = list(nums)
    target = len(values) - k if largest else k - 1
    left, right = 0, len(values)
    while left < right:
        pivot = values[random.randrange(left, right)]
        low = scan = left
        high = right
        while scan < high:
            if values[scan] < pivot:
                values[low], values[scan] = values[scan], values[low]
                low += 1
                scan += 1
            elif values[scan] > pivot:
                high -= 1
                values[scan], values[high] = values[high], values[scan]
            else:
                scan += 1
        if target < low:
            right = low
        elif target >= high:
            left = high
        else:
            return pivot
