各位大牛zi好,好久不见,今天在下课后的公交做了许多感想,自己在学习的路上貌似有点着急,总是急切的想要去赶进度,学新知识,也导致了自己对学过的知识不自信。虽然我只是一个js中级水平的菜鸟子,但我想卷算法hihi,国庆假期,学习了一些基本的算法,数组,链表、二叉树、了解了贪心思想,动态规划等。今天分享一下简单的冒泡排序,谈谈自己的理解,以及现阶段出现的问题,还请大牛zi指点迷津。
初始算法
起初接触和算法有联系的事物,那必然是我曾经最不喜欢的《数据结构》,不知道大家怎么看待这门课程,仅对我来说这可以说是我大二的噩梦,就,。,,很枯燥啊。 But,此时的我觉悟了,就像一颗子弹,从两年前的数据结构课堂发射,直到今天,子弹正中我的眉头,此时教育便真正开始了。
爱恨情仇,从起初的我认为算法是一门十分枯燥且难度极高的学问,直至最近我发现了算法的奥秘与神奇,起初看见算法题目,觉得好难,根本想不到,直至第一次解决算法问题,自己写了40行代码,题解只有短短5行,我第一次感受到了自己与这个代码世界的距离感,也初次了解到算法思想巧妙之处。接着我便学习题解,模仿复现,直到我遇见了——递归。(这te么啥啊)
递归让人又爱又恨,恨他起初让我不断怀疑人生,爱他--真香啊哎呀真香。递归递归,有递就有归,当自己看不懂它的时候好似也是再执行“递”的过程,坚持下去,一定会有“归”。
为什么要学习算法
一、谈谈我的理解
1、可以提高自己的上限,经济基础决定上层建筑
2、增强编程思维,强化逻辑
3、面试必备
4、不会算法不好意思说自己是搞程序的
5、很神奇
二、老师教的
1、算法是计算机世界的基本规则
2、构建你的思维模式
3、想理解框架源码的必备知识
4、vue和react的虚拟dom就是两棵树的diff
5、react16的fiber架构,就是把这棵树,改成了链表
6、jsx解析 用的是栈
7、缓存模块用的是链表
8、vue3的虚拟dom diff,使用的是最长递增子序列
冒泡排序
比如拿Kun来举例
大概思路:两个两个比较,找出最大的放在最后,再重复过程。下面看动图
好,相信看了坤哥的表演,你一定对这个思想有了一定的了解,那么我们来一起捋顺思路:
思路:
1、对未排序的各元素从头到尾依次比较两个相邻元素的大小
2、如果左边的大,则交换位置,一直比较到最后,最后一定是最大的
3、重复上述步骤
规律:
1、两两交换位置,所以需要一个中间变量。---->temp
2、每一轮比较完都会减少一个需要比较的元素,比较到最后只剩下一个元素时,不需要比较,所以一共比较 length-1 轮
3、每一轮比较完后都确定了一个相对最大的,所以每轮比较次数都会减少1,所以每一轮需要比较 length-1– i 次,这里的 length -1 也可以理解为每次比较两个元素,在比较到 arr[length] 时,arr[length+1] 就不存在了,所以我们必须为 length-1
思路清晰后我们来上代码(大家自己一定要手敲一遍,我就不放代码块了直接上图)
总结:
稳定性:遇到相等的值不会进行交换,是稳定的排序算法
时间复杂度:O(n^2) 运行效率低
适用场景:适用于数据量小的场景
留个问题:
你能想出一个效率更高的排序算法吗?它的时间复杂度为多少?
我的问题还请大牛zi指点迷津
现在学习算法应该不算晚吧,就是不知道自己应该怎么学习算法,我目前是尽量做到每天最少学习一道题,因为要学习正常的课程,基本都是抽出时间才专门学习算法。
学习过程有点着急,总是想着赶进度。老师讲的都可以掌握,剩下的时间基本都是赶进度,学算法,背知识点。
老师要求的项目都做了,剩下的时间应该预习更多的内容还是做更多的练习啊