See Also: Array Functions, CountArray, SearchArray, Working with Arrays
Returns the position in an array where a missing item should be inserted.
(BinarySearchInsertPos() )
Returns the position in an array where a missing item should be inserted. It must be called immediately following a BinarySearchArray call that returned no result.
If a binary search applied to a sorted array fails to find the target, it returns -1.
Move (BinarySearchArray(Target, MySortedArray)) to iIndex // if -1, not found
Move (BinarySearchArray(Target, MySortedArray,hoObject,hMsg)) to iIndex // if -1, not found
This only tells you that the item was not found. If you immediately call BinarySearchInsertPos following that failed search, it will return the position in the array where the missing item should have been found, which is the position where it should be inserted.
You can use this value with the InsertInArray to add the missing item to the array. This provides a mechanism for adding items to an already sorted array without needing to resort the entire array.
Move (BinarySearchArray(Target, MySortedArray)) to iIndex // if -1, not found
If (iIndex = -1) Begin
Move (BinarySearchInsertPos()) to iIndex
Move (InsertInArray(MySortedArray, iIndex,Target)) to MySortedArray
End
As with any binary search operation, it is the developer's responsibility to make sure that the array was properly sorted. The developer must also make sure that BinarySearchInsertPos is called before any other array search is performed.
Inserting an item into a very long array has a performance penalty as the array has to be shifted to make room for a new item. Appending values to an array is always the fastest way to add an item. Sorting an array also has an overhead but often this occurs only once after all items are added. With very large arrays, inserting a limited number of items into their sorted position may be faster than appending the items and then sorting them.
This example shows how to check a string array for the presence of a specific item (Customer name in this case), determine where in the array it belongs if it's not there already, and insert it.
Procedure OnClick
String[] sCustomers
String sSearchTerm
Integer iSearchIndex i iArraySize
Move "Smith" to sCustomers[0]
Move "Rodriguez" to sCustomers[1]
Move "Smith" to sCustomers[2]
Move "JOnes" to sCustomers[3]
Move "Anderson" to sCustomers[4]
Move "Schmidt" to sCustomers[5]
Move "Verne" to sCustomers[6
// array MUST BE SORTED using a CASE-INSENSITIVE SORT prior to calling BinarySearchArray
Move (SortArray(sCustomers, Desktop, (RefFunc(DFSTRICMP)))) to sCustomers
// search for "Nimoy", in any casing, in array
Move "Nimoy" to sSearchTerm
// perform a case-insensitive search for the search term
Move (BinarySearchArray(sSearchTerm, sCustomers, Desktop, (RefFunc(DFSTRICMP)))) to iSearchIndex
If (iSearchIndex = -1) Begin // item is not already in the array
Move (BinarySearchInsertPos()) to iSearchIndex
If (iSearchIndex <> -1) Begin // the position to insert the new item was found
Move (InsertInArray(sCustomers, iSearchIndex, sSearchTerm)) to sCustomers
End
End
// display array values
Move (SizeOfArray(sCustomers)) to iArraySize
For i from 0 to (iArraySize-1)
Showln sCustomers[i]
Loop
End_Procedure