算法图解入门笔记

算法图解入门笔记

二分查找

描述在有序数组中,二分查找的时间复杂度为 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,…]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Python入门笔记,我可以提供一些基本的知识点: 1. 在Python中,数字和字符串不能直接进行加法运算,只能是字符串和字符串的拼接。 2. 在编写Python程序时,如果在字符串中使用单引号,需要注意使用成对出现的单引号。如果使用单个单引号,可能会导致解析器报错。 3. 在Python中,逻辑运算符'and'和'or'不一定会计算右侧表达式的值。有时只需计算左侧表达式即可得出结果。这是因为'and'和'or'会将其中一个表达式的值作为最终结果,而不仅仅是True或False。 4. Python的流程控制中,顺序结构是最基本的结构,按照代码的编写顺序依次执行。 这些是Python入门笔记中的一些要点,希望对你有所帮助。如果你有其他问题,欢迎继续提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python入门课程笔记](https://blog.csdn.net/YV_LING/article/details/123413336)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [python入门学习笔记](https://blog.csdn.net/Lalalalazy/article/details/113181549)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值