携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
也是暑假自学python的第16天
排序算法
归并排序
归并排序在一般学习的都是两两归并排序,第一次将每两个元素分为一组进行排序,第二次将2*n=4个元素分为一组进行排序,以此,直到将所有元素并为一组。
以下为归并排序的递归代码
'''
归并排序
'''
def merge(self, low, high):
if low < high:
mid = (low + high) // 2
self.merge(low, mid)
self.merge(mid + 1, high)
self.merge_arr(low, mid, high)
在归并排序第一次以后要对数组进行合并
合并两个有序数组的方法:
两个数组进行合并,需要创建一个辅助数组,数组1设置标记i,数组2标记j,i与j都是从数组下标为0开始,将i与j进行比较,谁小就放入辅助数组中。而后i++/j++,辅助数组每放入一个元素都要进行+1,以此类推shuzu
如果一个组内的元素全部被放入到辅助数组中,那么另个一个数组还有剩余,直接将其全部复制到辅助数组中:
def merge_arr(self, low, mid, high):
help_arr=self.help_arr
arr=self.arr
for i in range(low,high+1): #把列表内的内容,复制到辅助列表
help_arr[i]=arr[i]
i=low
j=mid+1
k=low
while i<=mid and j<=high:
if help_arr[i]<help_arr[j]:
arr[k]=help_arr[i]
k+=1
i+=1
# 必须if和else,如果是两个if会访问越界,在第二次if时,访问help_arr[i]就会越界
else:
arr[k]=help_arr[j]
k+=1
j+=1
#把某一个剩余的元素都赋值过去
while i<=mid:
arr[k] = help_arr[i]
k += 1
i += 1
while j<=high:
arr[k] = help_arr[j]
k += 1
j += 1
时间复杂度
不同排序方式相比较:
我想这样的一张图就足以总结经常遇到的排序方法了
快速排序较为重要
二分查找
二分查找的时间复杂度为o(log2n)
二分查找的思路就是在一个已经排好序的数组里面,查找a,数组中间的值比他大,则找左边一半,比他小则找右边一半,每次以中间的数字为基准。
具体的代码如下:
def bsearch(arr,target):
high=len(arr)-1
low=0
while low<=high:
mid=(low+high)//2
if arr[mid]>target:
high=mid-1
elif arr[mid]<target:
low=mid+1
else:
return mid
return -1
在排序之后需要查找一个数字,就可以使用二分查找法,时间复杂度较低
今天的学习结束
=======================================================