# 二分算法查找 時(shí)間復(fù)制度log(n)
def binary_search(list,item):
row = 0
high = len(list)-1
while row <= high:
mid = int((row + high) / 2)
print('mid'+str(mid))
guess = list[mid]
if item == guess:
return mid
if item < guess:
high = mid - 1
else:
row = mid + 1
return None
if __name__ == '__main__':
res = binary_search([1,3,4,5,7,9],4)
print(res)
# 選擇排序 時(shí)間復(fù)雜度(O(n*n))
def find_smallest(arr):
smallest_idx = 0
smallest = arr[smallest_idx]
for i in range(len(arr)):
if arr[i] < smallest:
smallest_idx = i
smallest = arr[smallest_idx]
return smallest
def section_sort(arr):
new_arr = []
for i in range(len(arr)):
smallest = find_smallest(arr)
arr.remove(smallest)
new_arr.append(smallest)
print(new_arr)
if __name__ == '__main__':
section_sort([1,5,3,9])
# 快速排序 時(shí)間復(fù)雜度:O(nlog(n)) 分而治之
def quick_sort(arr):
if len(arr) < 2:
return arr
else:
pivot = arr[0]
less = [i for i in arr[1:] if i <= pivot]
greater = [i for i in arr[1:] if i> pivot]
return quick_sort(less) + [pivot] +quick_sort(greater)
if __name__ == '__main__':
new_arr = quick_sort([1,6,4,3])
print(new_arr)
#單向鏈表
#在python當(dāng)中,所有的變量都是引用,也就是指針; a = 10,表示a 這個(gè)引用指向10這塊內(nèi)存;既然a 是引用,也可以去指向其他類型,如
# a= 'hello'
#在其他語言比如c語言當(dāng)中,int a = 10;這個(gè)a 是10這個(gè)內(nèi)存的別名;注意別名不是地址,比如我叫方煜逵,我的別名叫小方,但是我的地址是在員村XXX,你可以到員村XXX這個(gè)地址找到我,
#但是你到小方這個(gè)地址找到我,顯然很扯!所以別名說的還是10這塊內(nèi)存;故這塊內(nèi)存是int類型,就無法在存其他了類型了;當(dāng)然c語言引入指針類型int *b 來指向10這塊內(nèi)存
class SingleNode(object):
def __init__(self,item):
"""單鏈表的結(jié)點(diǎn)"""
# _item存放數(shù)據(jù)元素
self.item = item
# _next是下一個(gè)節(jié)點(diǎn)的標(biāo)識(shí)
self.next = None
#單鏈表的實(shí)現(xiàn)
class SingleLinkList(object):
def __init__(self,head = None):
self.__head = head
def is_empty(self):
"""判斷鏈表是否為空"""
return self.__head == None
def length(self):
"""鏈表長(zhǎng)度"""
# cur初始時(shí)指向頭節(jié)點(diǎn)
cur = self.__head
count = 0
# 尾節(jié)點(diǎn)指向None,當(dāng)未到達(dá)尾部時(shí)
while cur != None:
count += 1
# 將cur后移一個(gè)節(jié)點(diǎn)
cur = cur.next
return count
def travel(self):
"""遍歷鏈表"""
cur = self.__head
while cur != None:
print(cur.item,end=' ')
cur = cur.next
print('')
# 尾部添加元素
def append(self,item):
"""尾部添加元素"""
node = SingleNode(item)
# 先判斷鏈表是否為空,若是空鏈表,則將_head指向新節(jié)點(diǎn)
if self.is_empty():
self.__head = node
# 若不為空,則找到尾部,將尾節(jié)點(diǎn)的next指向新節(jié)點(diǎn)
else:
cur = self.__head
while cur.next != None:
cur = cur.next
cur.next = node
#頭部添加元素
def add(self,item):
"""頭部添加元素"""
node = SingleNode(item)
node.next = self.__head
self.__head = node
def insert(self, pos, item):
if pos <= 0:
self.add(item)
elif pos >= self.length()-1:
self.append(item)
else:
node = SingleNode(item)
pre_cur = self.__head
cur_pos = 0
while cur_pos < pos-1:
pre_cur = pre_cur.next
cur_pos += 1
node.next = pre_cur.next
pre_cur.next = node
def search(self, item):
"""鏈表查找節(jié)點(diǎn)是否存在,并返回True或者False"""
cur = self.__head
while cur!= None:
if item == cur.item:
return True
else:
cur = cur.next
return False
def remove(self, item):
"""刪除節(jié)點(diǎn)"""
cur = self.__head
pre = None
while cur!= None:
if item == cur.item:
# 如果第一個(gè)就是刪除的節(jié)點(diǎn)
if cur == self.__head:
# 將頭指針指向頭節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)
self.__head = cur.next
cur = self.__head
else:
pre.next = cur.next
pre = cur
cur = cur.next
else:
pre = cur
cur = cur.next
if __name__ == '__main__':
l = SingleLinkList()
l.append(1)
l.append(2)
l.append(3)
l.append(4)
l.append(5)
l.append(6)
l.travel()
#單向循環(huán)鏈表
class SingleNode(object):
def __init__(self,item):
"""單鏈表的結(jié)點(diǎn)"""
# _item存放數(shù)據(jù)元素
self.item = item
# _next是下一個(gè)節(jié)點(diǎn)的標(biāo)識(shí)
self.next = None
#單鏈表的實(shí)現(xiàn)
class SingleSycLinkList(object):
def __init__(self,head = None):
if head:
self.__head = head
head.next = self.__head
else:
self.__head = None
def is_empty(self):
"""判斷鏈表是否為空"""
return self.__head == None
def length(self):
"""鏈表長(zhǎng)度"""
# cur初始時(shí)指向頭節(jié)點(diǎn)
cur = self.__head
count = 1
# 尾節(jié)點(diǎn)指向None,當(dāng)未到達(dá)尾部時(shí)
while cur.next != self.__head:
count += 1
# 將cur后移一個(gè)節(jié)點(diǎn)
cur = cur.next
return count
def travel(self):
"""遍歷鏈表"""
if self.is_empty():
return
cur = self.__head
while cur.next != self.__head:
print(cur.item,end=' ')
cur = cur.next
print(cur.item, end=' ')
# 尾部添加元素
def append(self,item):
"""尾部添加元素"""
node = SingleNode(item)
# 先判斷鏈表是否為空,若是空鏈表,則將_head指向新節(jié)點(diǎn)
if self.is_empty():
self.__head = node
node.next = self.__head
# 若不為空,則找到尾部,將尾節(jié)點(diǎn)的next指向新節(jié)點(diǎn)
else:
cur = self.__head
while cur.next != self.__head:
cur = cur.next
cur.next = node
node.next = self.__head
#頭部添加元素
def add(self,item):
"""頭部添加元素"""
node = SingleNode(item)
if self.is_empty():
self.append(item)
return
cur = self.__head
while cur.next != self.__head:
cur = cur.next
node.next = self.__head
cur.next = node
self.__head = node
def insert(self, pos, item):
if pos <= 0:
self.add(item)
elif pos >= self.length()-1:
self.append(item)
else:
node = SingleNode(item)
pre_cur = self.__head
cur_pos = 0
while cur_pos < pos-1:
pre_cur = pre_cur.next
cur_pos += 1
node.next = pre_cur.next
pre_cur.next = node
def search(self, item):
"""鏈表查找節(jié)點(diǎn)是否存在,并返回True或者False"""
if self.is_empty():
return False
cur = self.__head
while cur.next!= self.__head:
if item == cur.item:
return True
else:
cur = cur.next
if cur.item == item:
return True
return False
def remove(self, item):
"""刪除節(jié)點(diǎn)"""
if self.is_empty():
return
cur = self.__head
pre = None
while cur.next!= self.__head:
if item == cur.item:
# 如果第一個(gè)就是刪除的節(jié)點(diǎn)
if cur == self.__head:
# 將頭指針指向頭節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)
real = self.__head
while real.next != self.__head:
real = real.next
real.next = cur.next
self.__head = cur.next
else:
pre.next = cur.next
pre = cur
cur = cur.next
else:
pre = cur
cur = cur.next
# real = self.__head
# while real.next != self.__head:
# real = real.next
if item == cur.item:
pre.next = self.__head
if __name__ == '__main__':
l = SingleSycLinkList()
l.append(1)
# l.append(2)
# l.append(3)
# #
# l.add(0)
# l.insert(1,2)
# l.append(4)
#
#
# l.append(5)
# l.append(6)
l.remove(1)
l.travel()
#雙向鏈表
class Node(object):
def __init__(self,item):
self.item = item
self.pre = None
self.next = None
class DoubleLinkList(object):
def __init__(self,node = None):
self.__head = node
def is_empty(self):
"""鏈表是否為空"""
return self.__head == None
def length(self):
"""鏈表長(zhǎng)度"""
cur = self.__head
count = 0
while cur != None:
cur = cur.next
count += 1
return count
def travel(self):
"""遍歷鏈表"""
cur = self.__head
while cur!= None:
print(cur.item,end=' ')
cur = cur.next
print('')
def append(self,item):
"""鏈表尾部添加"""
node = Node(item)
if self.is_empty():
self.__head = node
else:
cur = self.__head
while cur.next != None:
cur = cur.next
cur.next = node
node.pre = cur
def add(self, item):
"""鏈表頭部添加"""
node = Node(item)
if self.is_empty():
self.__head = node
else:
cur = self.__head
node.next = cur
cur.pre = node
self.__head = node
def insert(self,pos, item):
"""指定位置添加"""
node = Node(item)
if pos <=0:
self.add(item)
elif pos >= self.length()-1:
self.append(item)
else:
cur = self.__head
count = 0
while count < pos:
cur = cur.next
count += 1
cur.pre.next = node
cur.pre = node
node = cur.pre
node.next = cur
def search(self,item):
"""查找節(jié)點(diǎn)是否存在"""
cur = self.__head
while cur!=None:
if cur.item == item:
return True
cur = cur.next
return False
def remove(self,item):
"""刪除節(jié)點(diǎn)"""
if self.is_empty():
return
else:
cur = self.__head
while cur != None:
if cur.item == item:
node_pre = cur.pre
node_next = cur.next
#當(dāng)刪除為首結(jié)點(diǎn)
if cur == self.__head:
self.__head = node_next
node_next.pre = None
# 當(dāng)刪除為尾結(jié)點(diǎn)
elif node_next == None:
cur.pre.next = None
else:
node_pre.next = node_next
node_next.pre = node_pre
cur = cur.next
if __name__ == '__main__':
dll = DoubleLinkList()
dll.append(2)
dll.append(3)
dll.append(4)
dll.append(5)
dll.add(1)
dll.insert(2,4)
dll.remove(1)
dll.travel()