Ми натрапили на групу математиків, які водночас є авторами-виконавцями. Вони написали пісню про кожне зі своїх улюблених чисел, а улюблених чисел у них, як можна уявити, багато (наприклад, 0 чи 73, або 6174).
Нам цікаво почути пісню про своє улюблене число, але через таку кількість пісень, які треба перебрати, пошук потрібної може зайняти чимало часу. На щастя, вони впорядкували свої пісні в плейлист, відсортований за назвою, а назва - це просто число, якому присвячено пісню.
Ми розуміємо, що можемо скористатися алгоритмом двійкового пошуку, щоб швидко знайти пісню за назвою.
Наше завдання - реалізувати алгоритм двійкового пошуку.
Алгоритм двійкового пошуку знаходить елемент у масиві, раз за разом ділячи його навпіл і зберігаючи лише ту половину, яка містить шуканий елемент. Це дає змогу швидко звужувати коло можливих місць розташування шуканого елемента, доки ми його не знайдемо або доки не виключимо всі можливі місця.
Двійковий пошук працює лише тоді, коли масив відсортовано.
Алгоритм має такий вигляд:
Ось приклад:
Припустімо, ми шукаємо число 23 у такому відсортованому масиві: [4, 8, 12, 16, 23, 28, 32].
[23, 28, 32].[23].У стандартній бібліотеці Rust уже є функція бінарного пошуку. У цій вправі не використовуйте цю функцію, натомість скористайтеся іншими базовими інструментами.
Чи вдалося пройти тести й зробити код чистим? Якщо є бажання, можна спробувати ще дещо.
Щоб запустити бонусні тести, приберіть атрибут #[ignore] і виконайте тести з
увімкненою можливістю generic, ось так:
$ cargo test --features generic
А потім поділіться своїми думками в коментарі до рішення. Чи зробив цей експеримент код кращим? Гіршим? Чи дізналися ми з нього щось корисне?