目录
一.排序
1.希尔排序
希尔排序排序是一种插入排序
代码
def shell_sort(alist):
n=len(alist)
gap=n//2
while gap>0:
for j in range(gap,n):
i=j
while i>0:
if alist[i]<alist[i-gap]:
alist[i],alist[i-gap]=alist[i-gap],alist[i]
i-=gap
else:
break
gap//=2
if __name__=="__main__":
li=[54,26,93,17,77,31,44,55,20]
print(li)
shell_sort(li)
print(li)
运行结果
/Users/lichengxiang/Desktop/python/venv/bin/python /Users/lichengxiang/Desktop/python/数据结构和算法/希尔排序.py
[54, 26, 93, 17, 77, 31, 44, 55, 20]
[17, 20, 26, 31, 44, 54, 55, 77, 93]进程已结束,退出代码0
2.快速排序
快速排序是一种交换排序
代码
def quick_sort(alist,first,last):
if first>=last:
return
mid_value=alist[first]
low=first
high=last
while low<high:
while low<high and alist[high]>=mid_value:
high-=1
alist[low]=alist[high]
while low<high and alist[low]<mid_value:
low+=1
alist[high]=alist[low]
alist[low]=mid_value
quick_sort(alist,first,low-1)
quick_sort(alist,low+1,last)
if __name__=="__main__":
li=[54,26,93,17,77,31,44,55,20]
print(li)
quick_sort(li,0,len(li)-1)
print(li)
运行结果
/Users/lichengxiang/Desktop/python/venv/bin/python /Users/lichengxiang/Desktop/python/数据结构和算法/快速排序.py
[54, 26, 93, 17, 77, 31, 44, 55, 20]
[17, 20, 26, 31, 44, 54, 55, 77, 93]进程已结束,退出代码0
3.归并排序
归并排序是一种外部排序
代码
def merge_sort(alist):
n=len(alist)
if n<=1:
return alist
mid=n//2
left_li=merge_sort(alist[:mid])
right_li=merge_sort(alist[mid:])
left_pointer,right_pointer=0,0
result=[]
while left_pointer<len(left_li) and right_pointer<len(right_li):
if left_li[left_pointer]<=right_li[right_pointer]:
result.append(left_li[left_pointer])
left_pointer+=1
else:
result.append(right_li[right_pointer])
right_pointer+=1
result+=left_li[left_pointer:]
result+=right_li[right_pointer:]
return result
if __name__=="__main__":
li=[54,26,93,17,77,31,44,55,20]
print(li)
sorted_li=merge_sort(li)
print(li)
print(sorted_li)
运行结果
/Users/lichengxiang/Desktop/python/venv/bin/python /Users/lichengxiang/Desktop/python/数据结构和算法/归并排序.py
[54, 26, 93, 17, 77, 31, 44, 55, 20]
[54, 26, 93, 17, 77, 31, 44, 55, 20]
[17, 20, 26, 31, 44, 54, 55, 77, 93]进程已结束,退出代码0
二.二分查找
1.二分查找(递归)
注:对列表进行切片,生成的是一个新对象,原有对象不变。
代码
def binary_searchDG(alist, item):
n=len(alist)
if n>0:
mid=n//2
if alist[mid]==item:
return True
elif item<alist[mid]:
return binary_searchDG(alist[:mid], item)
else:
return binary_searchDG(alist[mid + 1:], item)
return False
if __name__=="__main__":
li=[1,3,5,7,9]
print(binary_searchDG(li, 2))
print(binary_searchDG(li, 1))
运行结果
/Users/lichengxiang/Desktop/python/venv/bin/python /Users/lichengxiang/Desktop/python/数据结构和算法/二分查找.py
False
True进程已结束,退出代码0
2. 二分查找(非递归)
代码
def binary_searchFDG(alist,item):
n=len(alist)
first=0
last=n-1
while first<=last:
mid=(first+last)//2
if alist[mid]==item:
return True
elif item<alist[mid]:
last=mid-1
else:
first=mid+1
return False
if __name__=="__main__":
li=[1,3,5,7,9]
print(binary_searchFDG(li, 2))
print(binary_searchFDG(li, 1))
运行结果
/Users/lichengxiang/Desktop/python/venv/bin/python /Users/lichengxiang/Desktop/python/数据结构和算法/二分查找.py
False
True进程已结束,退出代码0