aboutsummaryrefslogtreecommitdiff
path: root/sorter.py
blob: ced8d7f88b8cb0b007914e5a62e9cf1f98ec9f55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
from math import floor

class Sorter:
  def __init__(self):
    self.data = []

  def __len__(self):
    return len(self.data)

  def comp(self, item1, item2): #these should be dim's
    #will return 'e' for equal, 'l' for less (i.e. item1 < item2), and 'g' for greater
    if item1[0] < item2[0]:
      return 'l'
    if item1[0] == item2[0] and item1[1] < item2[1]:
      return 'l'
    if item1[0] == item2[0] and item1[1] == item2[1]:
      return 'e'
    if item1[0] == item2[0] and item1[1] > item2[1]:
      return 'g'
    if item1[0] > item2[0]:
      return 'g'

  def __contains__(self, item):
    if len(self) == 0: #messes up the code if length == 0
      return False
    lo = 0
    hi = len(self) - 1
    while hi > lo:
      mid = floor((hi-lo)/2)+lo
      dif = self.comp(self[mid],item)
      if dif == 'l':
        hi = mid-1
      if dif == 'g':
        lo = mid+1
      if dif == 'e':
        return True
    if self[lo] == item:
      return True
    return False

  def __getitem__(self, ind):
    return self.data[ind]

  def insert(self, item):
    if len(self) == 0:
      self.data.insert(0, item)
      return 0
    lo = 0
    hi = len(self) - 1
    while hi > lo:
      mid = floor((hi-lo)/2)+lo
      dif = self.comp(self[mid],item)
      if dif == 'l':
        hi = mid-1
      if dif == 'g':
        lo = mid+1
      if dif == 'e':
        self.data.insert(mid, item)
        return mid+1
    dif = self.comp(self[lo],item)
    if dif == 'l':
      self.data.insert(lo,item)
      return lo
    if dif == 'e' or dif == 'g':
      self.data.insert(lo+1,item)
      return lo+1

  def index(self, item):
    lo = 0
    hi = len(self) - 1
    while hi > lo:
      mid = floor((hi-lo)/2)+lo
      dif = self.comp(self[mid],item)
      if dif == 'l':
        hi = mid-1
      if dif == 'g':
        lo = mid+1
      if dif == 'e':
        return mid
    if item == self[lo]:
      return lo
    else:
      raise(IndexError)

  def remove(self, item):
    ind = self.index(item)
    self.data.pop(ind)
    return ind

  def __repr__(self):
    return str(self.data)
test = Sorter()
test.insert((1,2))
test.insert((1,3))
print(test.insert((0,2)))
print((1,4) in test)