вот несколько решений:
-
если вы не хотите сортировать весь ввод, вы можете поместить временную коллекцию, которую вы хотите отсортировать (или использовать ту, которая уже всегда сортируется).
например, если вход «1,2,3,4,5,6,7,8,9, ... 1000», и вы хотите получить наибольшее число m-th, вы создаете временную коллекцию размер m, и каждый номер, который вы проходите, вы решаете, должен ли он находиться во временном массиве или нет. вы всегда должны сортировать временную коллекцию (или просто использовать ту, которая уже всегда сортируется), и вставлять в нее новый элемент, удаляя самый маленький, если его размер превышает m.
с точки зрения памяти вы используете небольшой размер элементов коллекции (m), и вы не изменяете входной массив.
с точки зрения количества операций (сложности), вы получаете примерно то же, что и для сортировки массива - O (nlogn), потому что для каждого элемента, который вы помещаете в массив temp, коллекции нужно, куда его поместить, и который принимает logn ( используя двоичный поиск, например).
Кстати, это решение примерно такое же, как и получение самого большого / наименьшего числа, просто вам не нужно сортировать элементы во временной коллекции, потому что это размер 1.
-
если вам не нужна память, но вы просто не хотите менять ввод, вы можете сделать копию массива и отсортировать его вместо этого ...
-
существует лучший алгоритм, который работает в линейном времени, работает аналогично тому, как вы получаете медианную (ссылка здесь ). вот ссылка, которая показывает это лучше.