Вы хотите разделить массив так, чтобы k наименьших элементов были первыми k элементами (не обязательно отсортированный порядок)?Если это так, то вы ищете обобщенный алгоритм поиска медианы, который работает в O (n) (просто Google для алгоритма поиска медианы).
Если вы можете жить с рандомизированным алгоритмом, который с высокой вероятностью заканчивается за линейное времятогда все, что вам нужно сделать, это продолжать выбирать свою опору случайным образом, что значительно упрощает реализацию.