常见算法讲解


1.冒泡排序

# python常见的几种算法 面试的时候
# 是一种简单的排序
# 怎么排序?相邻的一个一个比较 8 6 5 4 2      6 8 5 4 2       6 5 8 4 2   6 5 4 8 2   6 5 4 2 8
# 算法简介
# 1. 比较相邻的元素 前一个比后一个大(小)调换位置
# 2. 针对出来的最后一个元素重复上面的步骤
# 题目:列表数据[9,8,4,5,2,1,3,7,6] 进行排序 从小到大排序
list1 = [9,8,4,5,2,1,3,7,6]
# 这个列表里面有多少数据
len1 = len(list1)
print(len1)
# 循环:总共循环多少次? 8次
for i in range(1,len1):
    # print(i)
    # 需要一次一次的比较 第一次循环: 9要循环8次
    # 9-1=8 1,8 循环7次 len1 - 1
    # 第二次循环: 9 - 2 + 1 循环7
    for j in range(1,len1 - i+1):
        # 判断 第一个数 > 第二个数
            if list1[j-1] > list1[j]:
                list1[j-1],list1[j] = list1[j],list1[j-1]
print(list1)
# 第一个循环控制次数 总共要循环8次
# 第二个循环 真正的一个学员去进行比较 这个9要去比较 要比较8次 1. len-i+1 1,9 左闭右开的区间 循环8次
# 1.总共要循环8次 教练 学员9个人 排下名次
# 教练叫第一次: 9个学员中的某一个学员站出来 分别去挑战厉害的人 就把9放在最后
# j = 1 list[j - 1] list[0]>list[1] 9>8 列表[8,9.4.5,2,1,3,7,6]
# j = 2 list[j - 1] list[1]>list[2] 9>4 列表[8,4,9,5,2,1,3,7,6]
# j = 3 list[j - 1] list[2]>list[3] 9>5 列表[8,4,5,9,2,1,3,7,6]
# j = 4 list[j - 1] list[3]>list[4] 9>2 列表[8,4,5,2,9,1,3,7,6]
# j = 5 list[j - 1] list[4]>list[5] 9>1 列表[8,4,5,2,1,9,3,7,6]
# j = 6 list[j - 1] list[5]>list[6] 9>3 列表[8,4,5,2,1,3,9,7,6]
# j = 7 list[j - 1] list[6]>list[7] 9>7 列表[8,4,5,2,1,3,7,9,6]
# j = 8 list[j - 1] list[7]>list[8] 9>6 列表[8,4,5,2,1,3,7,6,9]

# 教练叫第二次: 8个学员中的某一个学员站出来 i=2
# 第二个数字要循环7次 len - i + 1 9-2+1=8 1,8 左闭右开 只循环7次
# [8,4,5,2,1,3,7,6,9]
# j = 1 list[j-1] list[0]>list[1] 8>4 替换[4,8,5,2,1,3,7,6,9]
# j = 2 list[j-1] list[1]>list[2] 8>5 替换[4,5,8,2,1,3,7,6,9]
# j = 3 list[j-1] list[2]>list[3] 8>2 替换[4,5,2,8,1,3,7,6,9]
# j = 4 list[j-1] list[3]>list[4] 8>1 替换[4,5,2,1,8,3,7,6,9]
# j = 5 list[j-1] list[4]>list[5] 8>3 替换[4,5,2,1,3,8,7,6,9]
# j = 6 list[j-1] list[5]>list[6] 8>7 替换[4,5,2,1,3,7,8,6,9]
# j = 7 list[j-1] list[6]>list[7] 8>6 替换[4,5,2,1,3,7,6,8,9]

2.选择排序

# 原理:在一组数据中从最开始找最大(小)的元素,放在排序的起始位置。
# 从大到小
list1 = [9,8,4,5,2,1,3,7,6]
# 最大值的下标 0
max_index = 0
# 循环8次
for i in range(0,len(list1)-1):
    for j in range(i+1,len(list1)):
        if list1[j] > list1[max_index]:
            max_index = j
    list1[i],list1[max_index] = list1[max_index],list1[i]
    max_index=i+1
print(list1)

# 如果8大于9 就把8的下标给到最大值
# 如果不大于9
#第一次循环:i=0
#j=1 list[1]>list[0] 8>9
#list[2]>list1[0] 4>9
#list[3]>list1[0] 5>9
#list[4]>list1[0] 2>9
#list[5]>list1[0] 1>9
#list[6]>list1[0] 3>9
#list[7]>list1[0] 7>9
#list[8]>list1[0] 6>9

list1 = [6,8,4,5,2,1,3,7,9]
# 最大值的下标 0
max_index = 0
# 循环8次
for i in range(0,len(list1)-1):
    for j in range(i+1,len(list1)):
        if list1[j] > list1[max_index]:
            max_index = j
    list1[i],list1[max_index] = list1[max_index],list1[i]
    max_index=i+1
print(list1)

#第一次循环
#i = 0
#j = 1
#list1[1] > list1[0] 8>6 进入判断 j=1 max_index=1
#list1[2] > list1[1] 4>8 不走入循环
#list1[3] > list1[1] 5>8不走入循环
#list1[4] > list1[1] 2>8不走入循环
#list1[5] > list1[1] 1>8不走入循环
#list1[6] > list1[1] 3>8不走入循环
#list1[7] > list1[1] 7>8不走入循环
#list1[8] > list1[1] 9>8不走入循环 j=8 max_index=8

#[9,8,4,5,2,1,3,7,6]
# max_index=1
# j=2
# list1[2]>list1[1] 4>8 不大于 不替换
# list1[3]>list1[1] 5>8 不大于 不替换
# list1[4]>list1[1] 2>8 不大于 不替换
# list1[5]>list1[1] 1>8 不大于 不替换
# list1[6]>list1[1] 3>8 不大于 不替换
# list1[7]>list1[1] 7>8 不大于 不替换
# list1[8]>list1[1] 6>8 不大于 不替换

3.递归

# 递给你拿回来
# 生活中递归:小时候传纸条 第一排传纸条传到最后的那个妹子 妹子手里 妹子给你回消息 传回来
# 编程中的递归:一种特殊函数,自己调用自己
# 递归的特点:一定要有出口,满足条件不执行返回执行本身
# 算法:计算1+2+3....+1000的题目
def sum_number(num):
    # print(num)
    if num == 1:
        return 1
    temp=sum_number(num-1)
    return temp+num
a=sum_number(3)
print(a)

#方法栈: 方法是先进后出
# num=3 sum_number(3)  返回3+3=6
# num=2 sum_number(3-1) 返回3=1+2
# sum_number(2-1) temp=1
# 1.方法都没有返回,就是没有执行完毕,压栈了
# 2.直到sum_number(2-1)有返回值了,依次出栈,最后返回sum_number(3)

# 树结构

4.面向对象作业

# 摆放家具
# 需求:
# 1)房子有户型,总面积和家具名称列表
# ?? ?新房子没有任何的家具
# 2)家具有名字和占地面积,其中
# ?? ?床:占4平米
# ?? ?衣柜:占2平面
# ?? ?餐桌:占1.5平米
# 3)将以上三件家具添加到房子中
# 4)打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表
class House:
    def __init__(self,house_type,area):
        self.house_type = house_type
        self.area = area
        # 没有家具用list装起来
        self.jiaju_list = []
        # 剩余面积
        self.free_area = area

    # 添加家具的方法
    def add_jiaju(self,jiajuyo):
        #家具面积 > 房子剩余面积 就不让它加进去,否则就可以加进去并且把房子面积-下来
        if jiajuyo.use_area > self.free_area:
            print('%s家具添加不进去了'%jiajuyo.name)
        else:
            self.jiaju_list.append(jiajuyo.name)
            self.free_area -= jiajuyo.use_area

    def __str__(self):
        return f'户型{self.house_type}总面积{self.area},剩余面积{self.free_area},家具有{self.jiaju_list}'
class jiaju:
    def __init__(self,name,user_area):
        self.name = name
        self.use_area = user_area

    def __str__(self):
        return f'我添加了{self.name},占地{self.use_area}'

bed = jiaju('床',4)
yigui = jiaju('衣柜',2)
canzhuo = jiaju('餐桌',8)
print(bed)
print(yigui)
print(canzhuo)

house = House('三室两厅',10)
house.add_jiaju(bed)
house.add_jiaju(yigui)
house.add_jiaju(canzhuo)
print(house)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

司小幽

真诚赞赏,手留余香。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值