blob: 9786fc9d87c5ef54d9e516005a82e4da3dca1381 [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
Chillar Anand96be3402019-04-08 13:31:09 +053012 lo = bisect_right(a, x, lo, hi)
Guido van Rossum4acc25b2000-02-02 15:10:15 +000013 a.insert(lo, x)
Guido van Rossum4e160981992-09-02 20:43:20 +000014
Tim Peters36cdad12000-12-29 02:06:45 +000015def bisect_right(a, x, lo=0, hi=None):
16 """Return the index where to insert item x in list a, assuming a is sorted.
17
18 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 +000019 a[i:] have e > x. So if x already appears in the list, a.insert(x) will
20 insert just after the rightmost x already there.
Tim Peters36cdad12000-12-29 02:06:45 +000021
22 Optional args lo (default 0) and hi (default len(a)) bound the
23 slice of a to be searched.
24 """
25
Georg Brandl2ee470f2008-07-16 12:55:28 +000026 if lo < 0:
27 raise ValueError('lo must be non-negative')
Guido van Rossum4acc25b2000-02-02 15:10:15 +000028 if hi is None:
29 hi = len(a)
30 while lo < hi:
Guido van Rossum54e54c62001-09-04 19:14:14 +000031 mid = (lo+hi)//2
Guido van Rossum4acc25b2000-02-02 15:10:15 +000032 if x < a[mid]: hi = mid
33 else: lo = mid+1
34 return lo
Tim Peters36cdad12000-12-29 02:06:45 +000035
Tim Peters36cdad12000-12-29 02:06:45 +000036def insort_left(a, x, lo=0, hi=None):
37 """Insert item x in list a, and keep it sorted assuming a is sorted.
38
39 If x is already in a, insert it to the left of the leftmost x.
40
41 Optional args lo (default 0) and hi (default len(a)) bound the
42 slice of a to be searched.
43 """
44
Chillar Anand96be3402019-04-08 13:31:09 +053045 lo = bisect_left(a, x, lo, hi)
Tim Peters36cdad12000-12-29 02:06:45 +000046 a.insert(lo, x)
47
48
49def bisect_left(a, x, lo=0, hi=None):
50 """Return the index where to insert item x in list a, assuming a is sorted.
51
52 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 +000053 a[i:] have e >= x. So if x already appears in the list, a.insert(x) will
54 insert just before the leftmost x already there.
Tim Peters36cdad12000-12-29 02:06:45 +000055
56 Optional args lo (default 0) and hi (default len(a)) bound the
57 slice of a to be searched.
58 """
59
Georg Brandl2ee470f2008-07-16 12:55:28 +000060 if lo < 0:
61 raise ValueError('lo must be non-negative')
Tim Peters36cdad12000-12-29 02:06:45 +000062 if hi is None:
63 hi = len(a)
64 while lo < hi:
Guido van Rossum54e54c62001-09-04 19:14:14 +000065 mid = (lo+hi)//2
Tim Peters36cdad12000-12-29 02:06:45 +000066 if a[mid] < x: lo = mid+1
67 else: hi = mid
68 return lo
Raymond Hettinger0c410272004-01-05 10:13:35 +000069
70# Overwrite above definitions with a fast C implementation
71try:
Raymond Hettinger9dbc6702009-03-31 17:51:51 +000072 from _bisect import *
Brett Cannoncd171c82013-07-04 17:43:24 -040073except ImportError:
Raymond Hettinger0c410272004-01-05 10:13:35 +000074 pass
Victor Stinner1018fad2016-11-24 23:31:59 +010075
76# Create aliases
77bisect = bisect_right
78insort = insort_right