github.com/grumpyhome/grumpy@v0.3.1-0.20201208125205-7b775405bdf1/grumpy-runtime-src/third_party/stdlib/bisect.py (about)

     1  """Bisection algorithms."""
     2  
     3  def insort_right(a, x, lo=0, hi=None):
     4      """Insert item x in list a, and keep it sorted assuming a is sorted.
     5  
     6      If x is already in a, insert it to the right of the rightmost x.
     7  
     8      Optional args lo (default 0) and hi (default len(a)) bound the
     9      slice of a to be searched.
    10      """
    11  
    12      if lo < 0:
    13          raise ValueError('lo must be non-negative')
    14      if hi is None:
    15          hi = len(a)
    16      while lo < hi:
    17          mid = (lo+hi)//2
    18          if x < a[mid]: hi = mid
    19          else: lo = mid+1
    20      a.insert(lo, x)
    21  
    22  insort = insort_right   # backward compatibility
    23  
    24  def bisect_right(a, x, lo=0, hi=None):
    25      """Return the index where to insert item x in list a, assuming a is sorted.
    26  
    27      The return value i is such that all e in a[:i] have e <= x, and all e in
    28      a[i:] have e > x.  So if x already appears in the list, a.insert(x) will
    29      insert just after the rightmost x already there.
    30  
    31      Optional args lo (default 0) and hi (default len(a)) bound the
    32      slice of a to be searched.
    33      """
    34  
    35      if lo < 0:
    36          raise ValueError('lo must be non-negative')
    37      if hi is None:
    38          hi = len(a)
    39      while lo < hi:
    40          mid = (lo+hi)//2
    41          if x < a[mid]: hi = mid
    42          else: lo = mid+1
    43      return lo
    44  
    45  bisect = bisect_right   # backward compatibility
    46  
    47  def insort_left(a, x, lo=0, hi=None):
    48      """Insert item x in list a, and keep it sorted assuming a is sorted.
    49  
    50      If x is already in a, insert it to the left of the leftmost x.
    51  
    52      Optional args lo (default 0) and hi (default len(a)) bound the
    53      slice of a to be searched.
    54      """
    55  
    56      if lo < 0:
    57          raise ValueError('lo must be non-negative')
    58      if hi is None:
    59          hi = len(a)
    60      while lo < hi:
    61          mid = (lo+hi)//2
    62          if a[mid] < x: lo = mid+1
    63          else: hi = mid
    64      a.insert(lo, x)
    65  
    66  
    67  def bisect_left(a, x, lo=0, hi=None):
    68      """Return the index where to insert item x in list a, assuming a is sorted.
    69  
    70      The return value i is such that all e in a[:i] have e < x, and all e in
    71      a[i:] have e >= x.  So if x already appears in the list, a.insert(x) will
    72      insert just before the leftmost x already there.
    73  
    74      Optional args lo (default 0) and hi (default len(a)) bound the
    75      slice of a to be searched.
    76      """
    77  
    78      if lo < 0:
    79          raise ValueError('lo must be non-negative')
    80      if hi is None:
    81          hi = len(a)
    82      while lo < hi:
    83          mid = (lo+hi)//2
    84          if a[mid] < x: lo = mid+1
    85          else: hi = mid
    86      return lo
    87  
    88  # Overwrite above definitions with a fast C implementation
    89  # try:
    90  #     from _bisect import *
    91  # except ImportError:
    92  #     pass