算法图解入门笔记
二分查找
描述在有序数组中,二分查找的时间复杂度为 log2 n。
如果是想找到列表中元素的最大步数则是log2 n 步
在一组数组{1,2,3,4,5,6,7,8}中,如果想要找到数字7的顺序为:
(1)找到mid的位置对应值为4(mid=3),判断number和4的值。
(2)number>mid,low=clear+1,clear=(4+7)//2,mid的值对应修改为{1,2,3,4,5,6,7,8}。
(3)同理下一次mid的值修改为{1,2,3,4,5,6,7,8},即找到7的步数为3。
def faye(eason,number):
low=0
c=0 #计步器
hight=len(eason)-1
while low<=hight:
clear=(low+hight)//2
print(clear)
mid=eason[clear]
c+=1
print(mid)
if mid==number:
return c
elif mid>number:
hight=clear-1
elif mid<number: #mid<125 则
low=clear+1
leslie=[]
for i in range(1,9):
leslie.append(i)
a=faye(leslie,7)#在有序列表中使用二分法找到125需要几步
print(a)
3
选择排序
第一次需要检查n个元素,但随后检查的元素数依次为n– 1, n – 2, …。平均每次检查的元素数为1/2 × n,因此运行时间为O(n × 1/2 × n)。但大O表示法省略诸如1/2这样的常数因此O(n^2)。
#选择排序
def findsmall(arr):
leslie=arr[0]
leslie_index=0
for i in range(1,len(arr)):
if leslie>arr[i]: #遍历找出最小的数
leslie=arr[i]
leslie_index=i
return leslie_index #索引位置
def asort(arr):
eason=[]
for i in range (len(arr)):
smallest=findsmall(arr) #return后
eason.append(arr.pop(smallest)) #pop索引位置=位置元素出栈
return eason
faye=[5,4,3,7,44,8,9,7,2]
print(asort(faye))
[2, 3, 4, 5, 7, 7, 8, 9, 44]
D&C(分而治之)
假设你是农场主,有一小块土地。你要将这块地均匀地分成方块,且分出的方块要尽可能大。
为满足一边长是另一边的整数倍,同时对余下的土地进同样炒作
原来的土地可以找到划分适用最大的方块
快速排序
快排基于D&C(分而治之)的思想,步骤如下:
(1) 选择基准值。
(2) 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。
(3) 对这两个子数组进行快速排序。
对其左边和右边进行递归调用则可以实现快排
左边: 右边:
[7]10[15] [ ]
列表加法 []+[1,2,3]+[4]=[1, 2, 3, 4]
运用递归实现快排,这里的基准值是每次选取第一个元素
如果数组无序,则它的平均时间复杂度为O(n log n)
如果数组有序,则是它的最糟情况,复杂度为O(n^2)
在最糟情况下,栈长为O(n),且一共有n层
最佳情况则层数为O(log n)(调用栈的高度为O(log n)),而每层需要的时间为O(n)。因此整个算法需要的时间为O(n) * O(log n) = O(n log n)。
def qsort(array):
if len(array)<2:
return array
else:
faye=array[0]
small=[i for i in array[1:] if i <faye] #左边比faye小的
print(small)
big = [j for j in array[1:] if j >faye]
print(big)
return qsort(small)+[faye]+qsort(big)
print (qsort([7,5,9,8,7,6]))
[5, 6, 7, 8, 9]
faye=[i for i in array[1:] if i <faye]的含义
如果i<基准值,则把array里的数赋给i,faye=[i,i1,i2,…]