不学不知道的数据结构算法之----冒泡排序+选择排序+递归

举报
是Dream呀 发表于 2022/07/30 21:56:11 2022/07/30
【摘要】 不学不知道的数据结构算法之----冒泡排序+选择排序+递归

不学不知道的数据结构算法之----冒泡排序+选择排序

@TOC

冒泡排序知识

无序表初始数据项的排列状况对冒泡排序没有影响
算法过程总需要经过n-1趟,随着趟数的增加,,对比次数逐步从n-1减少到1,并包括可能发生的数据项交换。
对比次数是1~n-1的累加:
1/2n的平方-1/2n
对比时间复杂度是O(n的平方)

对于每次交换而言时间复杂度也是O(n的平方),通常每次交换包括三次赋值。
最好的情况是0次,最坏是每次都交换。
冒泡排序作为时间效率最差的排序算法,来作为其它算法的对比基准。
有一点优势:无需任何额外的存储空间开销。

冒泡排序代码

def maopao(alist):
    for passnum in range(len(alist)-1,0,-1):
        for i in range(passnum):
            if alist[i]>alist[i+1]:
                temp = alist[i]
                alist[i]=alist[i+1]
                alist[i+1]=temp
    return alist
alist=[5,8,99,56,2,8,7]
print(maopao(alist))
# maopao(alist)
# print(alist)

选择排序

选择排序对冒泡排序进行了改进,保留了其基本多趟对比思路,每趟都是当前最大项就位。
但选择排序对交换进行了削减,相比起冒泡排序进行多次交换,每趟仅进行1次交换,记录最大项所在的位置,最后再跟本趟最后一项进项交换,
选择排序的时间复杂度比冒泡排序稍优:
对比次数不变,还是O(n的平方)
交换次数则减少为O(n)

选择排序代码

def xuanze(alist):
    for fillslot in range(len(alist)-1,0,-1):
        Max=0
        for i in range(1,fillslot+1):
            if alist[i]>alist[Max]:
                Max=i
        temp=alist[fillslot]
        alist[fillslot]=alist[Max]
        alist[Max]=temp
alist=[5,8,99,56,2,8,7]
xuanze(alist)
print(alist)

不学不知道的数据结构算法之----递归

@TOC

什么是递归

递归:将问题分解为更小规模的问题
特征:在算法流程中调用本身
巧妙地利用递归方法可以将复杂问题优雅化。

初识递归:数列求和

给定一个列表,返回所有数的和:

def listsum(numlist):
    theSum=0
    for i in numlist:
        theSum=theSum+i
    return theSum
print(listsum([1,3,5,7,9]))

这是最简单最普遍的一种方法,大家想一下,如果不用for或者while这种循环结构,只用递归结构,能不能解决呢?答案是能!

递归可以简单的说成就是:数列的和=‘首个数’ + ‘余下数列’ 的和
so:

def listsum(numlist):
    if len(numlist)==1:
        return numlist[0]
    else:
        return numlist[0]+listsum(numlist[1:])
print(listsum([1,3,5,7,9]))

要素:将其分解为最小规模,表现为调用自身

递归三定律

1.必须有一个基本结束条件
2.必须改变状态向基本结束条件演进,减小问题规模
3.递归算法必须调用本身

注意:递归的真谛就是将问题分解为规模更小的相同问题!在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。