算法入门

△向上生长, TO BE TO UP. 程序员成长充电站△

计算机基础课第 30 期分享

转载请联系授权(微信ID:qianpangzi0206)



前两周,我们"初尝"了高级编程语言(比如 Python 和 Java),我们讨论了几种语句 - 赋值语句,if 语句,循环语句,以及把代码打包成 "函数",比如算指数。重要的是,之前写的指数函数只是无数解决方案的一种,还有其它方案。

01

算法的定义


用不同顺序写不同语句也能得到一样结果,不同的是 "算法",意思是:解决问题的具体步骤。即使结果一致,有些算***更好,一般来说,所需步骤越少越好。不过有时我们也会关心其他因素,比如占多少内存。

"算法" 一词来自 波斯博识者 阿尔·花拉子密(1000 多年前的代数之父之一)如何想出高效算法 - 是早在计算机出现前就有的问题,从而诞生了专门研究计算的领域,然后发展成一门现代学科—计算机科学!

02

排序算法


记载最多的算法之一是"排序",排序到处都,比如给名字、数字排序,找最便宜的机票,按最新时间排邮件,按姓氏排联系人等这些都要排序。你可能想"排序看起来不怎么难… 能有几种算法呢?" ,答案是超多。计算机科学家花了数十年发明各种排序算法,还起了酷酷的名字,比如冒泡排序,快速排序,插入排序,归并排序等。

我们来试试排序!试想有一堆机票价格,都飞往  印第安纳波利斯 (美国地名)。


上图的这样一组数据  叫"数组"(Array),来看看怎么排序(建议拿出笔和纸跟着说明来排序),先从一种简单算法开始,先找到最小数,从最上面的 307 开始,因为现在只看了这一个,所以它是最小数,下一个是 239,比 307 小,所以新的最小数变成 239。下一个是 214 ,新的最小数,250 不是,384, 299, 223, 312 都不是,现在扫完了所有数字,214 是最小的

为了升序排列(从小到大排序),把 214 和最上面的数字,交换位置,刚排序了一个数字。现在重复同样的过程,这次不从最上面开始,从第 2 个数开始,先看到 239,我们当作是 "最小数",扫描剩下的部分,发现 223 最小,所以把它和第 2 位交换,重复这个过程,从第 3 位数字开始,让 239 和 307 互换位置,重复直到最后一个数字。

数字排好了,可以买机票了!

刚刚这种方法,或者说算法,叫 选择排序 - 非常基础的一种算法

以下是"伪代码"


03

算法复杂度


这个函数可以排序8个, 80个或8千万个数字,函数写好了就可以重复使用。这里用循环遍历数组,每个数组位置都跑一遍循环,找最小数然后互换位置,每个数组位置都跑一遍循环,找最小数然后互换位置,可以在代码中看到这一点(一个 for 循环套另一个 for 循环)。这意味着,大致来说,如果要排 N 个东西,要循环 N 次,每次循环中再循环 N 次,共 N*N,  或 N。算法的输入大小和运行步骤之间的关系叫算法的复杂度,表示运行速度的量级。

计算机科学家们把算法复杂度叫大 O 表示法,算法复杂度 O(N*N)效率不高

前面的例子有 8 个元素(n=8), 8*8= 64,如果 8 个变 80 个,运行时间变成 80*80 = 6400。虽然大小只增长了 10 倍(8 到 80),但运行时间增加了 100 倍!(64 到 6400 )。随着数组增大,对效率的影响会越来越大。这对大公司来说是个问题,比如谷歌要对几十亿条信息排序。


作为未来的计算机科学家你可能会问:有没有更高效的排序算法?我们下节继续

相关阅读:

 

  1. 从汇编语言到高级编程语言的演变

  2. 编程语言的基本元素

  3. 函数的强大之处


程序员成长充电站

长按扫码关注,每天五分钟学习计算机最基础的知识和原理

右下角

给个在看

全部评论

相关推荐

11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务