算法入门-排序算法
之前学习了js的相关语法,函数,数组,原型等,现在来学习程序员都要修炼的内功,算法与数据结构
什么是算法?
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
算法就是解决问题的一些策略
什么是数据结构?
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
其实数据结构就是数据与数据之间的关系
先从最简单的例子入手
表示两个数据
-
如果顺序有意义
[x,y]表示第一个是x,第二个是y 那么我们就要提供first和last操作
-
如果顺序没有意义
(x,y)和(y,x)一样 就不需要提供first和last操作
数据结构的作用
- 提前记住一些结构
这些结构能让你快速理清思路
2.锻炼抽象能力
一种数据结构往往能解决很多类似的问题
如果选错了数据结构,根本就想不出思路
如何快速了解数据结构和算法呢,我打算从排序算法入手
打算了解的几种排序算法
- 冒泡排序
- 选择排序
- 快速排序
- 归并排序
- 插入排序
- 计数排序
排序算法
冒泡排序
原理:
比较所有的相邻元素,如果第一个比第二个大,就交换它们
一轮下来,可以保证最后一个数是最大的
执行n-1轮,就可以完成排序
代码实现:
让冒泡的算法挂到数组的原型上,这样我们可以直接像调用js原生的sort方法一样去调用
时间复杂度O(n^2)
使用的数据结构:数组
选择排序:
选择排序思路:
找到数组中的最小值,选中它并将其放置到第一位
接着找到第二小的值,选中它放在第二位
递归实现方法:
首先我们实现用递归找出数组中的最小值
然后实现一个通过数组最小值找到数组最小值下标的方法
实现选择排序
循环实现方法:
时间复杂度O(n^2)
快速排序
思路:以某某为基准
想象你是一个体育委员,你面对的同学为【12,3,4,6,1,35,55】
以某某为基准,小的去前面,大的去后面
只要重复这句话,就能排序了
递归的时间复杂度为O(logN)
分区的时间复杂度为O(n)
所以时间复杂度为O(N*logN)
用到的数据结构:还是数组
思路:
不以某某为基准了
你现在面对的同学跟刚才一样是【12,3,4,6,1,35,55】
现在你让他们 左边一半排好序 右边一般排好序
然后左右合并起来
具体思路用图可以这样说明
mergeSort中其实就是用递归不断的吧数组分成两个部分
merge中对两个部分中的第一个进行比较,小的放到前面去,然后再递归
算法时间复杂度O(n*logn)
插入排序
思路:
从第二个数开始往前比
比它大就往后排
以此类推到最后一个数
插入排序的时间复杂度O(n^2)
计数排序
思路:
用一个哈希表来做记录
发现数组N就记 N:1 如果再次发现N就加1
最后把哈希表的key全部打出来,假设N:m 那么N需要打印m次
在js中 有一个数据结构可以很好的实现哈希表,字典 Map
实现方法:
可以很清楚的看到控制台打印的map中的结构
计数排序特点:
使用了数据结构hash表
只遍历了数组一遍 不过还要再遍历一次hash表
时间复杂度:O(n+max)