计导 第 8 章 算法

目录

 

算法两种定义

非正式定义

正式定义

三种结构

算法的表示

UML

伪代码

基本算法

求和

乘积

最值

排序

选择排序

冒泡排序

插入排序

查找

顺序查找

折半查找

子算法

递归

迭代

递归


算法两种定义

非正式定义

算法是一种逐步解决问题或完成任务的方法。按照这种定于,算法完全独立于计算机系统。接收一组输入数据,同时产生一组输出数据。

正式定义

算法是一组明确步骤的有序集合,它产生结构并在有限的时间内终止。

算法必须是一组定义良好并且有序的指令集合;每一步都必须清晰、明白的定义,即是每一步都不能有歧义;算法必须产生结果,结果可能是返回给调用算法的数据或其他效果(如打印);算法必须在有限的时间内终止。

三种结构

专家为结构化程序或算法定义了三种结构:分别是顺序、判断、循环。

算法的表示

UML

统一建模语言是算法的图形表示法,使用“大图”的形式掩盖算法的细节,只显示算法从开始到结束的整个流程。有一个好处是,UML图形有一套标准,看着图就快速的了解算法的概貌。比如三种结构的UML表示:

伪代码

没有标准,就是一个算法流程纪要,如三种结构的伪代码表述。个人认为不如UML直观。

基本算法

求和

一组数据求和,在循环中使用加法操作。

分为三个逻辑:

  1. 将和(sum)初始化;
  2. 循环,在每次循环迭代中将一个新数加到和(sum)上;
  3. 退出循环后返回和(sum);

乘积

一组数据乘积,在循环中使用加法操作。和求和逻辑类似。

分为三个逻辑:

  1. 将乘积(product)初始化;
  2. 循环,在每次循环迭代中将一个新数与乘积(product)相乘;
  3. 退出循环后返回乘积(product);

最值

思想是通过一个判断结构求得像个数的最值,然后把这个判断结构放到循环中,就可以求得一组数据的最值。

以求最大值为例:

  1. 将最大值(max_value)初始化;
  2. 循环,在每次循环迭代中将一个新数与之前的最大值(max_value)比较,如果新数大于max_value,则将max_value的赋值为新数的值,反之进入下一次循环;
  3. 退出循环后返回最大值(max_value);

排序

排序算法有很多中,在此只介绍三种基础的算法:选择排序、冒泡排序、插入排序。这三种排序算法是效率最低的排序算法。

关于稳定性:一组数据中两个相等的数据在排序前后其相对位置顺序是否改变,没改变则是稳定的排序算法,反之则是不稳定的排序算法。

查看更多:十大经典排序算法

选择排序

以升序为例,选择排序人为的把数据分为两段,已排序的和未排序的(已排序的在左边,未排序的在右边,假设中间有一道墙分割)。每一次找到未排序子列表中的最小值的位置,并把这个位置的数值和这个子列表中第一个位置的数值交换。分割墙向右移动一格,这样就完成了一轮排序,再重复以上的排序操作,每一轮找出的最小值房子已排序列表最后面作为已排序列表的最大值。选择排序是一个不稳定的排序算法。

一句话:每轮排序都选择在未排序列表中找出一个最小值放入已排序中,同时未排序列表缩减。

下边给出了对6个整数进行升序的选择排序的步骤: 

选择排序需要用到两重循环,外层循环每次迭代一次,内存循环在未排序列表中求出最小值。 

冒泡排序

数据列表也分成两个字列表:已排序的和未排序的。在未排序列表中,最小的元素通过冒泡的方式被浮上来并移到已排序列表中。

冒泡排序就是每一轮在未排序的子列表中相邻的两个数比较,如果左边的大于右边的,则两个数交换,这样一轮比较下来总是会选出一个最值来。

冒泡排序是稳定的排序算法。

一句话:每一轮在未排序列表中把小的元素往前调,在前面构建一个已排序列表。比较和交换都在在的两个相邻的元素之间。

下边给出了对6个整数进行升序的冒泡排序的步骤:此处是每一轮排序时从未排序的列表末尾往前两两比较交换,如果左边的大于右边的则交换,这样每一轮都能冒泡一个最小值出来。 

冒泡排序也用两重循环,外层循环每轮迭代一次,内存循环的每次迭代则将某一个元素冒泡到顶部。

插入排序

经常在扑克牌游戏中使用,玩家将每张拿到的牌插入到手中以有牌中合适的位置,一遍手中的牌以一定的顺序排列。这个例子中手中的牌是有序的,拿到的牌则是从无序的列表中获得。

和扑克排序一样,插入排序的列表页分为两部分:已排序和未排序,在每轮,把未排序子列表中的第一个元素移到已排序列表中,并且插入到合适的位置(插入的时候,这个元素需要与已排序列表中的部分元素比较)。

插入排序是稳定的排序算法。

一句话:每一轮在未排序列表中取出最前面的元素,插入到有序已排列列表中。

下边给出了对6个整数进行升序的插入排序的步骤。 

查找

在列表中确定目标所在位置的算法:顺序查找和折半查找。

顺序查找

顺序查找可以在任何列表中查找。从头开始找,找到或者是都列表尾就停止。

折半查找

折半查找只能在有序列表中查找,本质是缩小查找区间。要查找的值每次与要查找的区间中的中间位置的值对比,以更进一步缩小查找区间。找到元素或如果元素不在列表中停止。

子算法

结构化编程的原则要求将算法分成几个单元,称为自算法。每个自算法又可以分为更小的算法。

优点:更容易理解;子算法在除主算法外其他地方可重用,无需重写。

在上面的选择排序中,有两重循环,其内存获取未排序列表的最小值就可以独立成一个自算法。

递归

递归是算法自我调用的过程。

迭代

如果算法的定义不涉及算法本身,则算法是迭代的。

递归

每一个算法出现在它本身的定义中,该算法就是递归定义的。

递归都可以转化为迭代。在能够用迭代的地方就不要用递归。

递归算法简洁清晰,可读性强,每一次递归调用自身函数的时候,该函数都没有退出,而是继续运行。在函数调用过程中,系统会分配一个堆栈,当递归深度越深,堆栈的占用就越大,造成的后果就是会产生堆栈溢出。

迭代算法效率高,运行时间正比于循环次数,而且没有调用函数引起的额外开销。


凡是过往,即为序章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值