Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
Я хочу сделать бинарный поиск в сортированном массиве. Без рекурсии. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Если искомый элемент (key) есть в массиве (arr) то все нормально, функция возвращает индекс массива. Но если элемента нет в массиве я кручусь все время в цикле (while (!done)). Я что то никак не соображу по какому условию выйти из цикла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 10:00 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
Надо сжимать интервал, если он сжался, а ничего не нашлось, тогда ой. шпаргалка под спойлером, лучше не подглядывать, без крайней нужды. а додумать. потому что все несложно. Главное не забыть менять done - а то же там константа, поэтому цикл будет вращаться до конца света. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 10:26 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
По условию done = y, где у != 0 например внутри цикла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 10:27 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
Vladimir BaskakovНадо сжимать интервал, если он сжался, а ничего не нашлось, тогда ой. шпаргалка под спойлером, лучше не подглядывать, без крайней нужды. а додумать. потому что все несложно. Главное не забыть менять done - а то же там константа, поэтому цикл будет вращаться до конца света. большое спасибо. работает. но у меня тут еще одна проблема. я хочу вставлять элемент если он не найден. то есть я хочу вернуть не -1 а индекс на место которого я хочу вставить элемент. соответсвенно все элементы перед ним я сдвину вправо. как мне модифицировать функцию? я думал ввести условие Код: plaintext 1. но что то в нем не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 10:39 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
а проблема в том что это недостаточное условие. нужен какой то флаг - элемент не найден. но тогда получается нужно делать еще один пробег? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 10:48 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
jenya7, пробег делать не надо, достаточно ещё одного сравнения. Вот из Вики: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 11:07 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
jenya7, а done чем не флаг? в integer разных значений как грязи весной ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 11:10 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
MBojenya7, пробег делать не надо, достаточно ещё одного сравнения. Вот из Вики: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. а FOUND это что? дефайн? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 11:24 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
а FOUND это что? дефайн? Да, там возвращается структура из двух членов - индекс и boolean признак. Достаточно нелепо. Варианты: - изменить прототип, индекс сделать аргументом, а результат - boolean - возвращать положительный индекс при наличии, отрицательный при отсутствии. - при использовании исключительно для поиска места для вставки - оставить обычный интерфейс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 11:36 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
а где изменяется n? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 11:37 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
не хватает условия. я могу вывести флаг аргументом наружу int BinarySearch(int a[], int first, int last, int key, int *found) но нужно еще одно условие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 11:45 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
jenya7, это длина массива, она, в общем-то, не нужна и закомментарена. Код https://ru.wikipedia.org/wiki/Двоичный_поиск ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 11:46 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
jenya7, какое ещё условие нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 11:47 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
MBojenya7, какое ещё условие нужно? спасибо. сделал так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. похоже что работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 12:37 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
jenya7спасибо. сделал так Код: plaintext 1. Я так понимаю found это найдено/не найдено. Обычно наоборот делают, функция возвращает ошибку, а переменная под результат в параметрах, т.е. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 12:53 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
Dima Tjenya7спасибо. сделал так Код: plaintext 1. Я так понимаю found это найдено/не найдено. Обычно наоборот делают, функция возвращает ошибку, а переменная под результат в параметрах, т.е. Код: plaintext 1. понял. спасибо. переделаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 12:57 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
Siemargl http://www.cplusplus.com/reference/cstdlib/bsearch/ и не надо изобретать инетересно но сложно. вопрос что будет compar в моем случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 13:03 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
jenya7Siemargl http://www.cplusplus.com/reference/cstdlib/bsearch/ и не надо изобретать инетересно но сложно. вопрос что будет compar в моем случае? Там есть пример кода с твоим случаем, т.е. массивом int. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 13:06 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
Dima Tjenya7пропущено... инетересно но сложно. вопрос что будет compar в моем случае? Там есть пример кода с твоим случаем, т.е. массивом int. а где тут поиск середины? Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 13:17 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
jenya7Dima Tпропущено... Там есть пример кода с твоим случаем, т.е. массивом int. а где тут поиск середины? Код: plaintext 1. 2. 3. 4. Тут нет поиска середины, т.к. это компаратор, т.е. функция сравнения двух элементов массива. Сам алгоритм поиска внутри bsearch(), в которую передаются исходные данные, включая компаратор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 13:22 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
Dima Tэто компаратор, т.е. функция сравнения двух элементов массива Неправильно выразился, это функция сравнения значений по двум указателям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 13:26 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
Dima Tjenya7пропущено... а где тут поиск середины? Код: plaintext 1. 2. 3. 4. Тут нет поиска середины, т.к. это компаратор, т.е. функция сравнения двух элементов массива. Сам алгоритм поиска внутри bsearch(), в которую передаются исходные данные, включая компаратор. а нам нужна эта функция для бинарного поиска? мне кажется я могу передать нулевой указатель в качестве аргумента. все аргументы для поиска присутствуют в bsearch а компаратор как мне кажется лишний элемент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 13:36 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
jenya7Dima Tпропущено... Тут нет поиска середины, т.к. это компаратор, т.е. функция сравнения двух элементов массива. Сам алгоритм поиска внутри bsearch(), в которую передаются исходные данные, включая компаратор. а нам нужна эта функция для бинарного поиска? мне кажется я могу передать нулевой указатель в качестве аргумента. все аргументы для поиска присутствуют в bsearch а компаратор как мне кажется лишний элемент. bsearch() универсальная функция для любых типов, на входе у нее void*. Компаратор нужен для того чтобы правильно сравнить два void* ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 13:54 |
|
||
|
Бинарный поиск в С
|
|||
|---|---|---|---|
|
#18+
Dima Tjenya7пропущено... а нам нужна эта функция для бинарного поиска? мне кажется я могу передать нулевой указатель в качестве аргумента. все аргументы для поиска присутствуют в bsearch а компаратор как мне кажется лишний элемент. bsearch() универсальная функция для любых типов, на входе у нее void*. Компаратор нужен для того чтобы правильно сравнить два void* понял. спасибо. попробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2017, 14:23 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39540454&tid=1340253]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
176ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 292ms |

| 0 / 0 |
