第二章
均为个人实现,没有完全按照书中方式去做,因为感觉书中算法实现太多是按照C的方式,如果按部就班按照它的思路写代码,没有完全体现Python语言特征,因此我的算法主要是针对python语言特性来做的。
- 插入排序
def insert_sort(list):
i=0
for j in range(1,len(list)):
key=list[j]
i=j-1
while(i>0 & list[i]>key):
list[i+1]=list[i]
i=i-1
list[i+1]=key
return
2.递归插入实现
#思路是正确的。然而切片不支持深拷贝,所以运行有误,后一种类似于java版本的写法
'''
def insert_digui_sort(list):
if(len(list)>1):
key = list[-1]
insert_digui_sort(list[:-1])
#digui
length=len(list)-2
while(list[length]>key and length>-1):
list[length+1]=list[length]
length=length-1
list[length+1]=key
'''
def insert_recursion_sort(list,n):
if(n>1):
n=n-1
insert_recursion_sort(list,n)
#digui
length=n-1
key = list[length+1]
while(list[length]>key and length>-1):
list[length+1]=list[length]
length=length-1
list[length+1]=key
if (n==len(list)-1):
return list
else:
return
3.二分查找
def binary_find(value,list):
length=len(list)
start=0
end=length-1
mid=(int)((start+end)/2)
while(1):
if(list[mid]==value):
return mid
if(list[mid]>value):
end=mid-1
mid = (int)((start + end) / 2)
else:
start=mid+1
mid = (int)((start + end) / 2)
4.二分查找递归版
def binary_recur_find(value,list):
length = len(list)
start=0
end=length-1
def find(start,end):
mid = (int)((start + end ) / 2)
if(list[mid]==value):
return mid
if(list[mid]>value):
end=mid-1
return find(start, end)
else:
start=mid+1
return find(start, end)
return find(start,end)
网上找的简洁写法
> def binary_find(value,list):
low=0;
high=len(list)-1
while(low<=high):
mid=int((low+high)/2)
if(value==list[mid]):
return mid
if(value > list[mid]):
low=mid+1
elif(value < list[mid]):
high=mid-1
5.分治之合并排序
需要会推复杂度
def merge_sort(li):
def divide(li):
if(len(li)>1):
l1=li[0:(int)(len(li)/2)]
l2=li[(int)(len(li)/2):]
else:
return li
return merge(divide(l1),divide(l2))
def merge(list1,list2):
len1=len(list1)
len2=len(list2)
li=[]
m=0
n=0
i=0
while(i<len1+len2 and m<len1 and n<len2):
if list1[m]<=list2[n]:
li.append(list1[m])
m=m+1
i=i+1
elif(list1[m]>list2[n]):
li.append(list2[n])
n=n+1
i = i + 1
if(m<len1):
li.extend(list1[m:])
elif(n<len2):
li.extend(list2[n:])
return li
return divide(li)
算法上本人依然是菜鸟,如有疏漏,恳请指正。