Anonymous user
Binary search: Difference between revisions
m
→{{header|REXX}}: changed whitespace and comments, used a template for the output sections.
m (→{{header|REXX}}: changed whitespace and comments, used a template for the output sections.) |
|||
Line 4,886:
=={{header|REXX}}==
===recursive version===
Incidentally, REXX doesn't care if the values in the list are integers (or even numbers), as long as they're in order.
<br><br>(includes the extra credit)
<lang rexx>/*REXX program finds a value in a list of integers using
@=
/* [↑]
parse arg ? . /*get a
if ?=='' then do; say; say '***error*** no argument specified.'; say
▲ low = 1
avg= (word(@, 1) + word(@, high)) / 2▼
▲high = words(@)
▲avg=(word(@,1)+word(@,high))/2
▲ loc = binarySearch(low,high)
if loc==-1 then do; say ? " wasn't found in the list."
exit /*stick a fork in it, we're done.*/▼
end
else say ? ' is in the list, its index is: ' loc
say
say 'arithmetic mean of the ' high " values
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
binarySearch: procedure expose @ ?; parse arg low,high
if high<low then return -1
mid= (low + high) % 2 /*calculate the midpoint in the list. */
if ?=y then return mid
if y>? then return binarySearch(low, mid-1)
return binarySearch(mid+1, high)</lang>
<pre>
499.1 wasn't found in the list.
</pre>
<pre>
arithmetic mean of the 74 values
499 is in the list, its index is: 41
</pre>
===iterative version===
(includes the extra credit)
<lang rexx>/*REXX program finds a value in a list of integers using an iterative binary search.*/
@= 3 7 13 19 23 31 43 47 61 73 83 89 103 109 113 131 139 151 167 181,
193 199 229 233 241 271 283 293 313 317 337 349 353 359 383 389 401 409 421 433,
443 449 463 467 491 503 509 523 547 571 577 601 619 643 647 661 677 683 691 709,
743 761 773 797 811 823 829 839 859 863 883 887 911 919 941 953 971 983 1013
/* [↑]
parse arg ? . /*get a
if ?=='' then do; say; say '***error*** no argument specified.'; say
end
low
high
say 'arithmetic mean of the ' high " values
say
do while low<=high; mid= (low + high) % 2; y= word(@, mid)
if ?=y then
exit /*stick a fork in it, we're all done. */
end
if y>? then high= mid - 1 /*too high? */
else low= mid + 1 /*too low? */
end /*while*/
say ? " wasn't found in the list." /*stick a fork in it, we're all done. */</lang>
▲ /*stick a fork in it, we're done.*/</lang>
▲'''output''' when using the input of: <tt> -314 </tt>
<pre>
arithmetic mean of the 79 values
-314 wasn't found in the list.
</pre>
<pre>
arithmetic mean of the 79 values
619 is in the list, its index is: 53
</pre>
|