Mungkin tidak sulit untuk mengimplementasikan daftar sortir Anda sendiri di Python. Di bawah ini adalah bukti konsep:
import bisect
class sortlist:
def __init__(self, list):
self.list = list
self.sort()
def sort(self):
l = []
for i in range(len(self.list)):
bisect.insort(l, self.list[i])
self.list = l
self.len = i
def insert(self, value):
bisect.insort(self.list, value)
self.len += 1
def show(self):
print self.list
def search(self,value):
left = bisect.bisect_left(self.list, value)
if abs(self.list[min([left,self.len-1])] - value) >= abs(self.list[left-1] - value):
return self.list[left-1]
else:
return self.list[left]
list = [101, 3, 10, 14, 23, 86, 44, 45, 45, 50, 66, 95, 17, 77, 79, 84, 85, 91, 73]
slist = sortlist(list)
slist.show()
slist.insert(99)
slist.show()
print slist.search(100000000)
print slist.search(0)
print slist.search(56.7)
========= Hasil ============
[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 101]
[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 99, 101]
101
3
50
memcpy
masih merupakan operasi O (n) . Saya tidak yakin bagaimana Python mengimplementasikan daftar persis , tetapi taruhan saya adalah bahwa mereka disimpan dalam memori yang bersebelahan (tentu bukan sebagai daftar tertaut). Jika memang demikian, penyisipanbisect
yang Anda gunakan akan memiliki kompleksitas O (n) .