8086系列(12) 折半查詢

2021-10-25 10:19:39 字數 3060 閱讀 8501

在附加段中,有乙個從小到大順序排列的無符號陣列,其首位址存放在di暫存器中,陣列中的第乙個單元存放著陣列的長度。在ax中有乙個無符號數,要求在陣列中查詢ax,如找到,cf=0,並在si中給出該元素在陣列中的偏移位址;如未找到,置cf=1

折半查詢過程如下:

(1) 初始化被查詢陣列的首尾下標,low=1,high=n

(2) 若low>high 則查詢失敗,置cf=1,退出程式

否則計算中點 mid = (low+high)/2

(3) ax與中點元素比較,若ax = r[mid] ,則查詢成功,程式結束;

若kr[mid] ,轉為步驟五

(4) 低半部分查詢lower,high = mid-1,返回步驟2,繼續查詢

(5) 高半部分查詢higher,low = mid+1,返回步驟2,繼續查詢

datasg segment

low_idx dw ?

high_idx dw ?

datasg ends

;-----------------

extendsg segment

array dw 10,0,1,2,3,4,5,6,7,9,10 ;陣列的第乙個單元存放陣列的長度

extendsg ends

;***************==

codesg segment

assume es:extendsg,ds:datasg,cs:codesg

main proc far

start:

push ds

sub ax,ax

push ax

mov ax,datasg

mov ds,ax

mov ax,extendsg

mov es,ax

mov ax,3 ;ax中存放待比較的數

;------------------

;compare ax with first number

cmp ax,es:[di+2] ;ax和第乙個數比較

ja chk_last ;大於第乙個數

lea si,es:[di+2] ;第乙個數的偏移位址賦值給si

je exit ;ax等於第乙個數,cf=0

stc ;ax不等於第乙個數,cf=1

jmp exit

;compare ax with last number

chk_last:

mov si,es:[di] ;有幾個數

shl si,1 ;si*2 乙個數占兩個byte

add si,di ;si指向最後乙個數

cmp ax,es:[di] ;和最後乙個數比較

jb search ;小於最後乙個數,則需要查詢

je exit ;ax等於最後乙個數,cf=0

stc ;ax不等於最後乙個數,cf=1

jmp exit

;search for value within the list

search:

mov low_idx,1 ;low_idx 指向第乙個數

mov bx,es:[di]

mov high_idx,bx ;high_idx 指向最後乙個數

mov bx,di ;bx指向陣列元素的首位址 (bx+2)為第乙個數的位址

mid:

mov cx,low_idx

mov dx,high_idx

cmp cx,dx

ja no_match ;low_idx>high_idx 則退出查詢

add cx,dx

shr cx,1 ;計算cx = (low_idx+high_idx)/2

mov si,cx ;si為(low_idx+high_idx)/2

compare:

cmp ax,es:[bx+si] ;mid和ax比較

je exit ;相等退出

ja higher ;ax>[mid]

lower:

dec cx ;cx = (low_idx+high_idx)/2-1

mov high_idx,cx ;high_idx = (low_idx+high_idx)/2-1

jmp mid

higher:

inc cx ;cx = (low_idx+high_idx)/2+1

mov low_idx,cx ;low_idx = (low_idx+high_idx)/2+1

jmp mid

no_match:

stc;------------------

exit:

retmain endp

codesg ends

end start

一、測試ax能找到的情況,ax = 3

二、測試ax小於第乙個數的情況

三、測試ax大於最後乙個數的情況

四、測試ax夾在中間沒有找到的情況

ax = 8

24,折半查詢

include 折半查詢 二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用...

6 2 2 折半查詢

折半查詢,又稱二分查詢,它適用於有序的順序表。基本思路是 首先將給定值key與表中中間位置元素的關鍵字比較,若相等,則查詢成功,返回該元素的儲存位置 若不等,則所需查詢的元素只能在中間元素以外的前半部分或後半部分中 例如,在查詢表公升序排列時,若給定值key大於中間元素的關鍵字,則所查詢的元素只可能...

6 13 折半查詢

給乙個嚴格遞增數列,函式int search bin sstable t,keytype k 用來二分地查詢k在數列中的位置。函式介面定義 int search bin sstable t,keytype k 其中t是有序表,k是查詢的值。裁判測試程式樣例 include using namespa...