算法
学习至算法图解
1. 二分查找
原理:对于一组有序数据,每次从数据的中间开始查找,假如中间值正好与查找值相等,那表示已经找到;假如不等,则把数据组从中间分成前组和后组,如果需查找的数据比中间数大,则取后组再次进行查找,重复以上过程,直至找到。
时间复杂度:O(log2n)
Python实现:
def binary_search(li,item):
low=0
high=len(li)-1
while low<=high:
mid_index=int((low+high)/2)
mid=li[mid_index]
if item==mid:
return mid_index
elif item<mid:
high=mid_index-1
else:
low=mid_index+1
return None
测试:
li=[2,3,4,7,8,9,22,33,44,55,100]
item=55
#从li中查找55这个值,返回55的索引
index=binary_search(li,item)
li[index]·········返回55
2. 选择排序
原理:遍历未排序的的列表找出最小的值,然后把这个值取出放进另一个空列表中,再次这样做,找出第二小的值放入新列表中,以此类推,最终你会得到一个有序列表。
时间复杂度:O(n^2)
Python实现:
def getsmallest(li):
small_index=0
smallest=li[0]#存储最小的值
for i in range(len(li)):
if li[i]<smallest:
small_index=i
smallest=li[i]
return small_index
def selectSort(li):
new_li=[]
for i in range(len(li)):
index=getsmallest(li)
new_li.append(li.pop(index))
return new_li
测试:
selectSort([3,2,4,1,5,7,3,2,5,78,3,7,3,6,])
#
#返回:
[1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 7, 7, 78]
4.分而治之
原理:1.找到一个基线条件(这个条件必须尽可能简单),2.不断将问题分解(或者说缩小规模),直到符合基线条件)
1.使用递归来实现列表求和
def sum(li):
a=0
for i in li:
a=a+i
return a
2.编写一个递归函数来计算列表所包含的元素数
def count(li):
if not li:
return 0
else:
return 1+count(li[1:])
3.找出列表中的最大数字
def getLargest(li):
#基线条件,当列表中只剩下两个元素时发动
if len(li)==2:
if li[0]<=li[1]:
return li[1]
else:
return li[0]
sub_max=getLargest(li[1:])
if li[0]>sub_max:
return li[0]
else:
return sub_max
待续