贪心算法与冒泡排序

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

贪心算法与冒泡排序

知识点讲解

一个小案例

​ 在讲今天的课程之前,我首先讲一个小案例,大家买过鸡蛋的经历吗?就是去超市买鸡蛋,如果你们会做菜的话肯定买过鸡蛋,或者说你们小时候爸爸妈妈爷爷奶奶要你去买过鸡蛋,几毛钱一个,然后大家猜猜一板鸡蛋多少个?30个,那么现在假设我去超市买10个鸡蛋,超市里面只有一板鸡蛋,从30个里面挑10个鸡蛋,你们是怎么挑的,随性一点人可能直接数十个就走了,但是还有一种人,为了得到最好的结果,他会去挑选那些个头较大的鸡蛋,那么怎么个挑法呢?第一步,先从30个鸡蛋选取最大的一个,然后第二步,从剩下的29个中挑选最大的,一直这样选出十个鸡蛋来,最后选出的10个鸡蛋就是最好的结果吧,

​ 好了,买完了鸡蛋,其实你们已经学会了贪心算法

​ 不过在讲贪心算法之前,我先来带大家简单回顾一下算法的知识好吧

算法

什么是算法,算法就是解决问题的一中思路。算法导论中把它解释成一个工具,一种技术,一个计算过程,但是这里我们简单理解为思路。

我们解决买鸡蛋问题用了两种思路,你可以认为是两种算法-随缘算法和贪心算法,当然这个随缘算法是我发明的,你们随意。

对于算法而言,实现的语言并不重要,重要的是思想。(一定都是用c语言才能解决吗?不一定,其他语言一样能解决这个问题)

算法可以有不同的语言描述实现版本(如C描述、java描述、Python描述等),我们这堂课是在用Python语言进行描述实现。

贪心算法

前面我们通过挑鸡蛋来描述了这个贪心算法,就是我想要买十个鸡蛋,为了得到最好的结果,首先挑选那些个头较大的鸡蛋,第一步,先从30个鸡蛋选取最大的一个,然后第二步,从剩下的29个中挑选最大的,一直这样选出十个鸡蛋来,最后这样选10个鸡蛋就是最好的结果

那么专业的解释是什么呢?我们来看算法导论里面给出的解释:求解最优化问题的算法通常需要经过一系列的步骤,每个步骤都面临多种选择,如果每一步骤都作出当前看起来最佳的选择,然后这样有局部最优得到全局最优的结果。还是这个买鸡蛋的例子好理解。

扫描二维码关注公众号,回复: 6499597 查看本文章

那么对应的贪心算法思路是什么样子的呢?

贪心策略

选择当前看上去你认为最好的一个方案----挑选鸡蛋,最大的就是最好的,那么贪心策略就是挑选最大的鸡蛋

局部最优解

根据贪心策略,得到局部最优解,例如第一次的局部最优解就是从30个鸡蛋中挑选最大的鸡蛋,第二次的2局部最优解就是从29个鸡蛋中挑选最大的鸡蛋,等等

全局最优解

将所有的局部最优解合成原问题的一个最优解,每次都是最好的,那么结果就是最好的。

排序

接下来我们用上面的贪心算法去做一个案例!就是将一个列表里的数字从小到大排序

li = [2, 4, 9, 7, 3, 6, 5, 1]
# 那么我们根据这个步骤来实现这个从小到大排序
# 1.贪心策略
# 贪心策略已经很明显了,就是小的数字在前面,大的数字在后面
# 2.局部最优解
# 最后一位的最优解是最大的,然后第七位的最优解是剩下七位为最大的,然后第六位的最优解是剩下六位为最大的。。。
# 3.全局最优解
# 将所有的局部最优解合成原问题的一个最优解,那么我们就能将这个列表排序了

第一步最优解

# 第一步最优解:将9放到最后面
# 遍历-->根据索引取值-->交换
for i in range(len(li)-1):
    if li[i] > li[i+1]:
        li[i], li[i+1] = li[i+1], li[i]


if __name__ == '__main__':
    print(li)

第二步,第三步最优解…

for i in range(len(li)-1):
    if li[i] > li[i+1]:
        li[i], li[i+1] = li[i+1], li[i]


for i in range(len(li)-2):
    if li[i] > li[i+1]:
        li[i], li[i+1] = li[i+1], li[i]

for i in range(len(li)-3):
    if li[i] > li[i+1]:
        li[i], li[i+1] = li[i+1], li[i]


if __name__ == '__main__':
    print(li)

全局最优解

for j in range(1, len(li)):
    for i in range(len(li)-j):
        if li[i] > li[i+1]:
            li[i], li[i+1] = li[i+1], li[i]


if __name__ == '__main__':
    print(li)

好了,完成了,用贪心算法解决排序的问题,代码只有几行

冒泡排序,就是这个

冒泡排序:一次比较两个元素,如果他们的顺序错误就把他们交换过来,最小的元素慢慢浮到列表的顶端;他的思路就是贪心算法的思路

猜你喜欢

转载自blog.csdn.net/qq_42370150/article/details/91976306