blob: 7732c639e38699d6354ea87cc86549434f076635 [file] [log] [blame]
Guido van Rossum4acc25b2000-02-02 15:10:15 +00001"""Bisection algorithms."""
Guido van Rossum4e160981992-09-02 20:43:20 +00002
Tim Peters36cdad12000-12-29 02:06:45 +00003def 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
Georg Brandl2ee470f2008-07-16 12:55:28 +000012 if lo < 0:
13 raise ValueError('lo must be non-negative')
Guido van Rossum4acc25b2000-02-02 15:10:15 +000014 if hi is None:
15 hi = len(a)
16 while lo < hi:
Guido van Rossum54e54c62001-09-04 19:14:14 +000017 mid = (lo+hi)//2
Guido van Rossum4acc25b2000-02-02 15:10:15 +000018 if x < a[mid]: hi = mid
19 else: lo = mid+1
20 a.insert(lo, x)
Guido van Rossum4e160981992-09-02 20:43:20 +000021
Tim Peters36cdad12000-12-29 02:06:45 +000022def bisect_right(a, x, lo=0, hi=None):
23 """Return the index where to insert item x in list a, assuming a is sorted.
24
25 The return value i is such that all e in a[:i] have e <= x, and all e in
Guido van Rossumd8faa362007-04-27 19:54:29 +000026 a[i:] have e > x. So if x already appears in the list, a.insert(x) will
27 insert just after the rightmost x already there.
Tim Peters36cdad12000-12-29 02:06:45 +000028
29 Optional args lo (default 0) and hi (default len(a)) bound the
30 slice of a to be searched.
31 """
32
Georg Brandl2ee470f2008-07-16 12:55:28 +000033 if lo < 0:
34 raise ValueError('lo must be non-negative')
Guido van Rossum4acc25b2000-02-02 15:10:15 +000035 if hi is None:
36 hi = len(a)
37 while lo < hi:
Guido van Rossum54e54c62001-09-04 19:14:14 +000038 mid = (lo+hi)//2
Guido van Rossum4acc25b2000-02-02 15:10:15 +000039 if x < a[mid]: hi = mid
40 else: lo = mid+1
41 return lo
Tim Peters36cdad12000-12-29 02:06:45 +000042
Tim Peters36cdad12000-12-29 02:06:45 +000043def insort_left(a, x, lo=0, hi=None):
44 """Insert item x in list a, and keep it sorted assuming a is sorted.
45
46 If x is already in a, insert it to the left of the leftmost x.
47
48 Optional args lo (default 0) and hi (default len(a)) bound the
49 slice of a to be searched.
50 """
51
Georg Brandl2ee470f2008-07-16 12:55:28 +000052 if lo < 0:
53 raise ValueError('lo must be non-negative')
Tim Peters36cdad12000-12-29 02:06:45 +000054 if hi is None:
55 hi = len(a)
56 while lo < hi:
Guido van Rossum54e54c62001-09-04 19:14:14 +000057 mid = (lo+hi)//2
Tim Peters36cdad12000-12-29 02:06:45 +000058 if a[mid] < x: lo = mid+1
59 else: hi = mid
60 a.insert(lo, x)
61
62
63def bisect_left(a, x, lo=0, hi=None):
64 """Return the index where to insert item x in list a, assuming a is sorted.
65
66 The return value i is such that all e in a[:i] have e < x, and all e in
Guido van Rossumd8faa362007-04-27 19:54:29 +000067 a[i:] have e >= x. So if x already appears in the list, a.insert(x) will
68 insert just before the leftmost x already there.
Tim Peters36cdad12000-12-29 02:06:45 +000069
70 Optional args lo (default 0) and hi (default len(a)) bound the
71 slice of a to be searched.
72 """
73
Georg Brandl2ee470f2008-07-16 12:55:28 +000074 if lo < 0:
75 raise ValueError('lo must be non-negative')
Tim Peters36cdad12000-12-29 02:06:45 +000076 if hi is None:
77 hi = len(a)
78 while lo < hi:
Guido van Rossum54e54c62001-09-04 19:14:14 +000079 mid = (lo+hi)//2
Tim Peters36cdad12000-12-29 02:06:45 +000080 if a[mid] < x: lo = mid+1
81 else: hi = mid
82 return lo
Raymond Hettinger0c410272004-01-05 10:13:35 +000083
84# Overwrite above definitions with a fast C implementation
85try:
Raymond Hettinger9dbc6702009-03-31 17:51:51 +000086 from _bisect import *
Brett Cannoncd171c82013-07-04 17:43:24 -040087except ImportError:
Raymond Hettinger0c410272004-01-05 10:13:35 +000088 pass
Victor Stinner1018fad2016-11-24 23:31:59 +010089
90# Create aliases
91bisect = bisect_right
92insort = insort_right