0010/* PBINSEAR 0020/* Quick search in a sorted array 0030/* Klaus-Peter Plog 0040/* 0050DEFINE DATA LOCAL 0060/*----------------------------------------------------- Array definition 00701 #ARRAY-COUNT(I2) INIT <10> 00801 #ARRAY(A2/10) INIT <'00','03','07','10','11','12','14','20','22','28'> 0090/*------------------------------------------------ That, what you search 01001 #SEARCH(A2) 0110/*--------------------------------------------- Variables of the routine 01201 #BEG(I2) 01301 #END(I2) 01401 #P(I2) 01501 #EXIT(L) 01601 #FOUND(L) 0170/*---------------------------------------------------------------------- 0180END-DEFINE 0190/* 0200ASSIGN #SEARCH = '20' 0210PERFORM BINARY-SEARCH 0220IF #FOUND 0230 WRITE #SEARCH 'found at position' #P 0240ELSE 0250 WRITE #SEARCH 'not found' 0260END-IF 0270/* 0280DEFINE SUBROUTINE BINARY-SEARCH /*====================================== 0290RESET #EXIT #FOUND 0300ASSIGN #BEG = 1 0310ASSIGN #END = #ARRAY-COUNT 0320REPEAT WHILE NOT #EXIT 0330 COMPUTE #P = (#END - #BEG) / 2 + #BEG 0340 DECIDE FOR FIRST CONDITION 0350 WHEN #SEARCH > #ARRAY(#P) COMPUTE #BEG = #P + 1 0360 WHEN #SEARCH < #ARRAY(#P) COMPUTE #END = #P - 1 0370 WHEN #SEARCH = #ARRAY(#P) ASSIGN #FOUND = #EXIT = TRUE 0380 WHEN NONE IGNORE 0390 END-DECIDE 0400 IF NOT #FOUND AND (#P = #END OR = #BEG) 0410 ASSIGN #EXIT = TRUE 0420 END-IF 0430END-REPEAT 0440END-SUBROUTINE /*======================================================= 0450END