【更新中】《算法图解》个人学习记录python

前置介绍:
掌握一门编程语言的c++选手,本文档用于记录《算法图解》的学习进程。本文代码实现用python写,穿插python初学者和算法初学者的感受,欢迎大家评论区讨论交流学习
在这里插入图片描述

第一章 二分查找的原理

二分查找是一种在有序数组中查找特定元素的算法。其原理是将数组分为两半,然后根据目标元素与中间元素的比较结果,决定在数组的左半部分还是右半部分继续查找。这个过程会重复进行,直到找到目标元素或搜索范围为空。

一个python新手的感受

与c++语法区别
1.函数 def,结尾是return。
2.if(){} else(){},while,后面是冒号
3.以缩进来判断语句,不需要加上分号
推荐语法文档:菜鸟教程

二分查找的python代码

#二分查找的函数
def binary_search(arr,target):
    left=0
    right=len(arr)-1
    while left<=right:
        mid = (left+right)//2
        guess = arr[mid]
        if guess==target:
            return guess
        if guess<target:
            left=mid+1
        else:
            right=mid-1
    return None
#应用程序
myarr=[1,3,5,7,8]
print (binary_search(myarr,3))
print (binary_search(myarr,10))

第二章 选择排序

元素操作:插入、删除
问题描述:将歌曲播放列表的进行排序【歌曲 播放次数】
数据结构介绍:数组、链表

python前置知识

在Python中,数组通常指的是列表(list)类型。列表是Python中非常灵活的数据结构,支持多种操作和函数。以下是一些常用的列表操作方法:
append(x):在列表末尾添加一个元素。
extend(iterable):一次性追加另一个序列中的多个值。
insert(i, x):在指定位置插入一个元素。
remove(x):移除列表中第一个值为x的元素。
pop([i]):移除列表中的一个元素(默认最后一个),并且返回它。如果指定索引i,则移除该位置的元素。
clear():清空列表。
index(x[, start[, end]]):返回列表中第一个值为x的元素的索引。如果提供可选参数start和end,则在指定范围内搜索。
count(x):返回列表中值为x的元素的数量。
sort(key=None, reverse=False):对列表中的元素进行排序。
reverse():反转列表中元素的顺序。
copy():返回列表的副本。
len(s):返回列表的长度。
min(s):返回列表中最小元素。
max(s):返回列表中最大元素。
sum(s):返回列表中所有元素的和。

对一列数进行排序

# 查找数组中的最大元素,然后重新排序
# 先找到最大值
def arr_max(arr):
    max_val = arr[0]
    arr_index = 0
    for i in range(len(arr)):
        if max_val < arr[i]:
            max_val = arr[i]
            arr_index = i
    return arr_index

# 存储到新数组中
def maxsort(arr):
    new_arr = []
    while arr:  # 循环直到原数组为空
        index = arr_max(arr)
        new_arr.append(arr[index])
        arr.pop(index)  # 从原数组中移除最大元素
    return new_arr

myarr = [23, 12, 56, 11, 34, 98]
new = maxsort(myarr)
print(new)

对音乐播放列表进行排序

对“数+其它信息”进行排序
与上文代码变动之处:变动地方,仅仅改变arr_max,因为本代码的数据列表的第二列才是播放次数

def arr_max(arr):
    max_val = arr[0][1]
    arr_index = 0
    for i in range(len(arr)):
        if max_val < arr[i][1]:
            max_val = arr[i][1]
            arr_index = i
    return arr_index
# 存储到新数组中
def maxsort(arr):
    new_arr = []
    while arr:  # 循环直到原数组为空
        index = arr_max(arr)
        new_arr.append(arr[index])
        arr.pop(index)  # 从原数组中移除最大元素
    return new_arr

song_plays = [
    ("Love Story", 100),
    ("Shape of You", 150),
    ("Blinding Lights", 200),
    ("Bad Guy", 180),
    ("Uptown Funk", 220),
    ("Despacito", 210),
    ("Someone Like You", 160),
    ("Bohemian Rhapsody", 190),
    ("Rolling in the Deep", 170),
    ("Dance Monkey", 240)
]
new = maxsort(song_plays)
print(new)

第三章 递归

如何理解递归?
递归函数的要求:基线条件(base case)和递归条件(recursive case)
递归条件指的是函数调用自己,基线条件是停止调用自己,避免陷入无限循环。
提示:问问自己,该问题可以用递归函数解决吗?

数据结构介绍:栈

如何去理解图示?这个例子有点特别,函数跳转来理解,实际上是嵌套+顺序
执行greet()过程中,进入greet2()后,执行完回到greet(),后继续执行bye(),执行完后回到greet()。
我们平时见到的是只有顺序的,类比俄罗斯套娃。
栈的操作有哪些?

代码

写一个倒计时的程序

# 递归函数简单示例
def countdown(i):
    print(i)
    #递归条件
    if i>0:
        countdown(i-1)
    #基线条件
    else:
        return
# 应用
countdown(5)

问候示例

# 问候示例,栈
def greet(name):
    print ("Hello,"+name+"!")
    greet2(name)
    print("getting ready to say bye...")
    bye(name)
def greet2(name):
    print("How are you,"+name+"?")
def bye(name):
    print("Bye,"+name+"!")

greet("Amy")

递归调用栈

现在,让我们通过一个例子来理解递归调用栈是如何工作的,以计算 5!(5的阶乘)为例。

# 递归调用栈,自己绘画理解一下,如何表示阶乘
def factorial(x):
    if x==1:
        return 1
    else:
        return x*factorial(x-1)
print(factorial(5))

阶乘函数 factorial(x) 的定义是:

如果 x 等于 1,那么 factorial(x) 等于 1。
否则,factorial(x) 等于 x 乘以 factorial(x-1)。
当我们调用 factorial(5) 时,递归调用栈如下:
factorial(5)
|
|-----> factorial(4)
| |
| |-----> factorial(3)
| | |
| | |-----> factorial(2)
| | | |
| | | |-----> factorial(1)
| | | |
| | | |-----> 返回 1
| | |-----> 返回 2 * 1 = 2
| |-----> 返回 3 * 2 = 6
|-----> 返回 4 * 6 = 24
|
|-----> 返回 5 * 24 = 120

每次函数调用都会在调用栈上创建一个新的层级,直到达到基本情况(x == 1),然后逐层返回,计算出最终的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值