前端也要懂算法,阅《算法图解》有所得。
相信咱们常常会听到“堆”、“栈”之类的字眼,那么计算机的内存是什么呢?当咱们去游泳时,咱们须要将东西存在保险柜里,可能东西比较多,一个放不下,这时候就须要申请2个保险柜,再将东西放在柜子里,手里拿着开柜的钥匙。前端
计算机的内存分配亦是如此,当咱们须要使用内存时,咱们须要申请空闲内存,再将数据存入申请的内存里,最终获得存放数据的内存地址。若是咱们须要访问一个数据,只须要知道数据存放的地址,就能访问。算法
数组和链表是计算机最基础的2种数据结构。假如咱们须要将5个数据放入内存中,那么计算机须要分给咱们5个内存空间,那么使用数组和链表的区别是什么呢?数组
若是使用数组存储,那么咱们须要计算机分配5个相邻的内存空间,由于数组的每一个元素都是有序且相邻的。此时,咱们很容易发现,若是我须要往数组里插入一个元素,那么咱们可能会面临以下困境:数据结构
若是使用链表来存储,以上问题将会迎刃而解。性能
一样,以链表的形式存储5个元素,每一个元素都记录着下一个元素的地址,那么只须要知道一个元素,就能获得整个链表,而不须要每一个元素都相邻。
这样咱们插入一个新元素,只须要改变上一个元素记录的地址。
固然,事情不会这么简单,数组与链表各有优劣。code
上篇文章介绍了大O计数法表示一个算法的速度,那么咱们来看看数组与链表插入、删除、和查找一个元素的速度:排序
数组 链表 查找 O(1) O(n) 插入 O(n) O(1) 删除 O(n) O(1)
显而意见,数组在查找操做上的性能较高,由于数组的每一个元素都是相邻的,从而支持随机查找,即若是知道了第一个元素,那么第4个元素的位置也能猜到。相反,链表存储的数据则须要从头开始查找,由于只有前一个元素才知道后一个元素的位置。
同理: 对于插入和删除, 链表只须要修改上一个元素的地址,而数组若是插入的数据是中间的,则须要对后面全部的元素进行补位。内存
由此,很容易得出结论:io
选择排序的思想是,若是有一组数据须要从大到小排序,那么先找出最大的,移除,再在剩下的数中找第二大的,依次类推。其算法速度:O(n^2)function
function selectionSort(myArray){ var len = myArray.length, min; for (i = 0; i < len; i++){ // 将当前位置设为最小值 min = i; // 检查数组其他部分是否更小 for (j = i+1; j < len; j++){ if (myArray[j] < myArray[min]){ min = j; } } // 若是当前位置不是最小值,将其换为最小值 if (i != min){ swap(myArray, i, min); } } return myArray; } function swap(myArray, p1, p2){ var temp = myArray[p1]; myArray[p1] = myArray[p2]; myArray[p2] = temp; }