Вот мой первоначальный алгоритм:
create array of size 100 [0..99].
read first 100 numbers and put into array.
sort array in ascending order.
while more numbers in file:
get next number N.
if N > array[0]:
if N > array[99]:
shift array[1..99] to array[0..98].
set array[99] to N.
else
find, using binary search, first index i where N <= array[i].
shift array[1..i-1] to array[0..i-2].
set array[i-1] to N.
endif
endif
endwhile
Это имеет (очень незначительное) преимущество в том, что для первых 100 элементов нет перетасовки O (n ^ 2), только O (n log n)сортировать и что вы очень быстро идентифицируете и выбрасываете те, которые слишком малы.Он также использует бинарный поиск (максимум 7 сравнений), чтобы найти правильную точку вставки, а не 50 (в среднем) для упрощенного линейного поиска (не то, чтобы я предлагал кому-то еще предложить такое решение, просто чтобы оно могло впечатлить интервьюера).
Вы можете даже получить бонусные баллы за предложение использовать оптимизированные shift
операции, такие как memcpy
в C, при условии, что вы можете быть уверены, что перекрытие не является проблемой.
Еще одна возможность, которую вы можете рассмотреть, - это поддерживать три списка (до 100 целых чисел в каждом):
read first hundred numbers into array 1 and sort them descending.
while more numbers:
read up to next hundred numbers into array 2 and sort them descending.
merge-sort lists 1 and 2 into list 3 (only first (largest) 100 numbers).
if more numbers:
read up to next hundred numbers into array 2 and sort them descending.
merge-sort lists 3 and 2 into list 1 (only first (largest) 100 numbers).
else
copy list 3 to list 1.
endif
endwhile
Я не уверен, но это может оказаться более эффективным, чем непрерывныйshuffling.
Сортировка слиянием - это простой выбор по строкам (для списков сортировки слиянием 1 и 2 в 3):
list3.clear()
while list3.size() < 100:
while list1.peek() >= list2.peek():
list3.add(list1.pop())
endwhile
while list2.peek() >= list1.peek():
list3.add(list2.pop())
endwhile
endwhile
Проще говоря, вытягивая верхние 100 значенийиз объединенного списка в силу того, что они уже отсортированы в порядке убывания.Я не проверил подробно, будет ли это более эффективным, я просто предлагаю это как возможность.
Я подозреваю, что интервьюеры будут впечатлены потенциалом мышления «из коробки» ифакт, что вы заявили, что его следует оценивать на результативность.
Как и в большинстве интервью, технические навыки составляют один из того, на что они смотрят.