У меня есть следующий отсортированный по алфавиту массив строк:
let collection = ["ABC", "BCD", "CAB", "FGH", "JKL", "ZKL"];
Я хочу вставить строку "CQW"
в коллекцию, сохраняя при этом отсортированный порядок , но без необходимости сортировки весь массив снова и снова.
Так что я хотел бы иметь ["ABC", "BCD", "CAB", "CQW", "FGH", "JKL", "ZKL"];
после завершения вставки за O(log n)
раз.
Я подумал, что было бы неплохо рассчитать индекс при котором мне нужно вставить элемент с помощью бинарного поиска.
Я нашел следующий код для двоичного поиска, который извлекает индекс строки, если она существует внутри коллекции:
function binarySearch(items, value) {
let startIndex = 0;
let stopIndex = items.length - 1;
let middle = Math.floor((stopIndex + startIndex) / 2);
while (items[middle] != value && startIndex < stopIndex) {
//adjust search area
if (value < items[middle]) {
stopIndex = middle - 1;
} else if (value > items[middle]) {
startIndex = middle + 1;
}
//recalculate middle
middle = Math.floor((stopIndex + startIndex) / 2);
}
// Return -1 if element is not in collection
return (items[middle] != value) ? -1 : middle;
}
let collection = ["ABC", "BCD", "CAB", "FGH", "JKL", "ZKL"];
console.log(binarySearch(collection, "CQW"));
Однако я изо всех сил пытался изменить его так, чтобы он возвращал точный индекс, по которому необходимо вставить строку. Как это можно изменить, чтобы оно работало? Является ли бинарный поиск наиболее эффективным способом сделать это?