Двоичный (Бинарный) поиск - Assembler

Узнай цену своей работы

Формулировка задачи:

Листинг программы
  1. .data
  2. buffer_for_string db 10 dup(0)
  3. title_string db "Результат: ",0
  4. szformat db "%d",0Dh,0Ah,0 ; изменяем формат вывода на hex
  5. massiv dd 0,1,2,3,4,5,6,7,8
  6. massivD db 1,2,3,4,5,6,7,8 ; костыль
  7.  
  8. dlinnaMassiva=$-massivD
  9. ZagadannoeChislo dd 3
  10. ;===========Code
  11. .code
  12. mov eax,dlinnaMassiva
  13. mov ecx,2
  14. cdq
  15. idiv ecx ; в eax заносится центральный элемент
  16.  
  17. mov esi,eax
  18. startD:
  19. mov eax,massiv[esi*4]
  20. mov ebx,ZagadannoeChislo
  21.  
  22. cmp eax,ebx
  23. jl Right
  24. jg Left
  25. je ResultD ; or jmp Result
  26. Right:
  27. mov eax,esi
  28. mov ebx,2
  29. cdq
  30. idiv ebx
  31. add esi,eax
  32. jmp startD
  33. Left:
  34. mov eax,esi
  35. mov ebx,2
  36. cdq
  37. idiv ebx
  38. sub esi,eax
  39. jmp startD
  40.  
  41. ResultD:
  42.  
  43. mov Result,eax
  44.  
  45. ;======вывод результата
  46. push Result
  47. push offset szformat
  48. push offset buffer_for_string
  49. call wsprintf
  50. push MB_OK
  51. push offset title_string
  52. push offset buffer_for_string
  53. push 0
  54. call MessageBox
  55. push 0
  56. call ExitProcess
  57. main endp
  58. end start
Собственно, правильно ли реализован в данном куске кода Двоичный (Бинарный) поиск - ?

Решение задачи: «Двоичный (Бинарный) поиск»

textual
Листинг программы
  1.     /* Если просматриваемый участок непустой, first < last */
  2.     while (first < last) {
  3.         size_t mid = first + (last - first) / 2;
  4.  
  5.         if (x <= a[mid])
  6.             last = mid;
  7.         else
  8.             first = mid + 1;
  9.     }

Объяснение кода листинга программы

  1. Проверяется условие: если просматриваемый участок не пустой, то есть в нем есть по крайней мере один элемент, то выполняется цикл while.
  2. Внутри цикла while вычисляется средний индекс участка, который будет использоваться для сравнения: mid = first + (last - first) / 2.
  3. Сравнивается значение x с элементом массива a с индексом mid.
  4. Если x меньше или равно значению элемента с индексом mid, то выполняется операция присваивания last = mid, что означает, что искомый элемент находится в левой половине участка.
  5. Если x больше значения элемента с индексом mid, то выполняется операция присваивания first = mid + 1, что означает, что искомый элемент находится в правой половине участка.
  6. Цикл while повторяется до тех пор, пока не будет выполнено одно из условий выхода из цикла.
  7. Если в процессе выполнения цикла first и last встретились (то есть совпали), это означает, что искомый элемент отсутствует в массиве.
  8. Если цикл завершился, но first и last не встретились, это означает, что искомый элемент найден, и его индекс равен mid.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы