Index of Functions: A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X 
Index Page
lstlei

Table of contents
Procedure
Abstract
Required_Reading
Keywords
Declarations
Brief_I/O
Detailed_Input
Detailed_Output
Parameters
Exceptions
Files
Particulars
Examples
Restrictions
Literature_References
Author_and_Institution
Version

Procedure

     LSTLEI ( Last integer element less than or equal to )

     INTEGER FUNCTION  LSTLEI ( X, N, ARRAY )

Abstract

     Find the index of the largest array element less than or equal
     to a given integer X in an array of non-decreasing integers.

Required_Reading

     None.

Keywords

     ARRAY
     SEARCH

Declarations

     IMPLICIT NONE

     INTEGER          X
     INTEGER          N
     INTEGER          ARRAY ( * )

Brief_I/O

     VARIABLE  I/O  DESCRIPTION
     --------  ---  --------------------------------------------------
     X          I   Upper bound value to search against.
     N          I   Number of elements in ARRAY.
     ARRAY      I   Array of possible lower bounds.

     The function returns the index of the last element of ARRAY that
     is less than or equal to X.

Detailed_Input

     X        is an integer value acting as an upper bound: the element
              of ARRAY that is the greatest element less than or equal
              to X is to be found.

     N        is the total number of elements in ARRAY.

     ARRAY    is an array of integers that forms a non-decreasing
              sequence. The elements of array need not be distinct.

Detailed_Output

     The function returns the index of the highest-indexed element in
     the input array that is less than or equal to X. The routine
     assumes the array elements are sorted in non-decreasing order.

     Indices range from 1 to N.

     If all elements of ARRAY are greater than X, the routine returns
     the value 0. If N is less than or equal to zero, the routine
     returns the value 0.

Parameters

     None.

Exceptions

     Error free.

     1)  If N is less than or equal to zero, the function returns 0.
         This case is not treated as an error.

     2)  If the input array is not sorted in non-decreasing order, the
         output of this routine is undefined. No error is signaled.

Files

     None.

Particulars

     This routine uses a binary search algorithm and so requires
     at most on the order of

        log (N)
           2

     steps to compute the value of LSTLEI.

     Note: If you need to find the first element of the array that is
     greater than X, simply add 1 to the result returned by this
     function and check to see if the result is within the array bounds
     given by N.

Examples

     Suppose that you have an reasonably large ordered array of
     integers, into which you want to insert a few more without
     destroying the ordering.

     Depending upon your application, it may be desirable to
     not insert duplicates, to insert duplicates before
     existing entries or to insert them after existing entries.

     The code fragment below, illustrates an insertion scheme
     that will insert duplicate items after existing items
     and simultaneously update a second parallel array of
     double precision numbers.

           get the pair to insert

           READ (*,*) KEY, VALUE

           locate the place to insert the new KEY into the sorted
           array of keys.

           LOC = LSTLEI ( KEY, NKEYS, KEYS ) + 1

           insert the key and its associated value into the
           KEYS and  VALUES arrays at location LOC

           CALL INSLAI ( KEY,   1, LOC, NKEYS, KEYS   )
           CALL INSLAD ( VALUE, 1, LOC, NVALS, VALUES )

     If at the READ statement the arrays KEYS and VALUES looked like:

           KEYS     VALUES     NKEYS = 6, NVALS = 6
           ----     -------
             2       3.00D0
             5       1.00D0
             7       3.14D0
            16       7.11D0
            18       2.14D0
            23      12.12D0

     and 9 and 33.33D3 were read into KEY and VALUE respectively
     then LSTLEI (KEY, NKEYS, KEYS ) would be 3 and LOC would be 4.
     After the calls to the routines INSLAI and INSLAD we would have

           KEYS     VALUES     NKEYS = 7, NVALS = 7
           ----     -------
             2       3.00D0
             5       1.00D0
             7       3.14D0
             9      33.33D3     <===== inserted items.
            16       7.11D0
            18       2.14D0
            23      12.12D0

     If 7 and 33.33D3 were read into KEY and VALUE respectively
     then again LSTLEI (KEY, NKEYS, KEYS ) would be 3 and LOC would
     be 4. After the calls to the routines INSLAI and INSLAD we
     would have:

           KEYS     VALUES     NKEYS = 7, NVALS = 7
           ----     -------
             2       3.00D0
             5       1.00D0
             7       3.14D0
             7      33.33D3     <===== inserted items.
            16       7.11D0
            18       2.14D0
            23      12.12D0

     If we replaced the line of code

           LOC = LSTLEI ( KEY, NKEYS, KEYS ) + 1
     by

           LOC = LSTLTI ( KEY, NKEYS, KEYS ) + 1

     we would obtain a routine that inserted duplicates before
     existing entries. (LSTLTI is similar to LSTLEI except it finds
     the last occurrence of an integer strictly less than a value.)
     Using 7 and 33.33D3 for KEY and VALUE again, the modified code
     fragment would yield the results shown below.

           KEYS     VALUES     NKEYS = 7, NVALS = 7
           ----     -------
             2       3.00D0
             5       1.00D0
             7      33.33D3     <===== inserted items.
             7       3.14D0
            16       7.11D0
            18       2.14D0
            23      12.12D0


     (Note: you should NOT use the
     code outlined above as the basis of a sorting algorithm.
     The NAIF routines SHELLI, SHELLD, SHELLC, ORDERI, ORDERD, ORDERC,
     REORDI, REORDD and REORDC are much more efficient routines for
     sorting arrays or sorting a set of parallel arrays using
     one of the set as a key. The fragment presented here is useful
     for performing update insertions into previously ordered arrays.)

     For more ideas regarding the use of this routine, see LSTLEC
     and LSTLTC.

Restrictions

     1)  If the sequence of integer numbers in the input array ARRAY is
         not non-decreasing, the program will run to completion but the
         index found will not mean anything.

Literature_References

     None.

Author_and_Institution

     J. Diaz del Rio    (ODC Space)
     H.A. Neilan        (JPL)
     W.L. Taber         (JPL)

Version

    SPICELIB Version 1.1.0, 26-OCT-2021 (JDR)

        Added IMPLICIT NONE statement.

        Edited the header to comply with NAIF standard. Removed
        unnecessary $Revisions section. Improved $Detailed_Input,
        $Detailed_Output, $Particulars, $Exceptions and $Restrictions
        sections.

    SPICELIB Version 1.0.1, 10-MAR-1992 (WLT)

        Comment section for permuted index source lines was added
        following the header.

    SPICELIB Version 1.0.0, 31-JAN-1990 (WLT) (HAN)
Fri Dec 31 18:36:32 2021