Files
car-os/bisect.gd
T

87 lines
1.7 KiB
GDScript
Raw Normal View History

2026-07-04 18:22:23 -06:00
extends Node
func insort_right(a: Array, x, lo: int = 0, hi=null):
lo = bisect_right(a, x, lo, hi)
a.insert(lo, x)
func bisect_right(a: Array, x, lo: int = 0, hi=null):
if lo < 0:
return
if hi == null:
hi = a.size()
var mid: int = 0
while lo < hi:
mid = (lo + hi) / 2
if x < a[mid]:
hi = mid
else:
lo = mid + 1
return lo
func insort_left(a: Array, x, lo:int = 0, hi=null):
lo = bisect_left(a, x, lo, hi)
a.insert(lo, x)
func bisect_left(a: Array, x, lo:int = 0, hi=null):
if lo < 0:
return
if hi == null:
hi = a.size()
var mid: int = 0
while lo < hi:
mid = (lo + hi) / 2
if a[mid] < x:
lo = mid + 1
else:
hi = mid
return lo
func bisect(a: Array, x, lo: int = 0, hi=null):
return bisect_right(a, x, lo, hi)
func insort(a: Array, x, lo: int = 0, hi=null):
return insort_right(a, x, lo, hi)
func reverse_insort_right(a: Array, x, lo: int = 0, hi=null):
lo = reverse_bisect_right(a, x, lo, hi)
a.insert(lo, x)
func reverse_bisect_right(a: Array, x, lo: int = 0, hi=null):
if lo < 0:
return
if hi == null:
hi = a.size()
var mid: int = 0
while lo < hi:
mid = (lo + hi) / 2
if -x < -a[mid]:
hi = mid
else:
lo = mid + 1
return lo
func reverse_insort_left(a: Array, x, lo:int = 0, hi=null):
lo = reverse_bisect_left(a, x, lo, hi)
a.insert(lo, x)
func reverse_bisect_left(a: Array, x, lo:int = 0, hi=null):
if lo < 0:
return
if hi == null:
hi = a.size()
var mid: int = 0
while lo < hi:
mid = (lo + hi) / 2
if -a[mid] < -x:
lo = mid + 1
else:
hi = mid
return lo
func reverse_bisect(a: Array, x, lo: int = 0, hi=null):
return reverse_bisect_right(a, x, lo, hi)
func reverse_insort(a: Array, x, lo: int = 0, hi=null):
return reverse_insort_right(a, x, lo, hi)