Home | History | Annotate | Download | only in Lib
      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
     93