set serveroutput on
set verify off
accept p_nums prompt '어떤 배열? '
accept p_num prompt '찾을 숫자는? '
declare
type array_t is varray(100) of number(10);
v_nums array_t := array_t();
v_num number(20) := &p_num ;
v_index number(10) ;
v_vindex number(10) ;
begin
v_nums.extend ( regexp_count('&p_nums', ' ') + 1 ) ;
for i in 1 .. v_nums.count loop
v_nums(i) := to_number( regexp_substr('&p_nums', '[^ ]+', 1, i));
end loop ;
v_index := (v_nums.count) / 2 ;
v_vindex := (v_nums.count) / 2 ;
for i in 1 .. log(2, v_nums.count)+1 loop
if (v_vindex / 2) < 1 then
v_vindex := 0 ;
else
v_vindex := v_vindex / 2 ;
end if;
if
v_nums(v_index) > v_num
then
v_index := v_index - v_vindex ;
elsif
v_nums(v_index) < v_num
then
v_index := v_index + v_vindex ;
end if;
exit when v_nums(v_index) = v_num ;
exit when v_vindex < 1 ;
end loop;
if v_nums(v_index) = v_num then
dbms_output.put_line('숫자중에서 ' || v_num || '은 검색됩니다.');
else
dbms_output.put_line('숫자중에서 ' || v_num || '은 검색 안 됩니다.');
end if;
end;
/