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

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

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

.data
buffer_for_string db 10 dup(0)
title_string db "Результат:  ",0
    szformat db "%d",0Dh,0Ah,0      ; изменяем формат вывода на hex
 
massiv dd 0,1,2,3,4,5,6,7,8
massivD db 1,2,3,4,5,6,7,8 ; костыль

dlinnaMassiva=$-massivD
 
ZagadannoeChislo dd 3
 
;===========Code
.code
 
mov eax,dlinnaMassiva
 
mov ecx,2
 
cdq
 
idiv ecx ; в eax заносится центральный элемент 

mov esi,eax
 
startD:
 
mov eax,massiv[esi*4]
mov ebx,ZagadannoeChislo

cmp eax,ebx 
jl Right
jg Left
je ResultD ; or jmp Result
 
Right:
mov eax,esi
mov ebx,2
cdq
idiv ebx
add esi,eax
jmp startD
 
Left:
 
mov eax,esi
mov ebx,2
cdq
idiv ebx
sub esi,eax
jmp startD

ResultD:

mov Result,eax

;======вывод результата
push Result
    push offset szformat
    push offset buffer_for_string
    call wsprintf
 
    push MB_OK
    push offset title_string
    push offset buffer_for_string
    push 0
    call MessageBox
 
    push 0
    call ExitProcess
 
main endp
end start
Собственно, правильно ли реализован в данном куске кода Двоичный (Бинарный) поиск - ?

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

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

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

  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
Похожие ответы