HTML5学堂-码匠:数据快速的计算与排序,与前端页面性能有直接的关系。因为排序的算法有不少,在本次“算法系列”的分享当中,咱们先从简单易上手的选择排序法开始,其它的排序算法会随后陆续跟你们一块儿分享。前端
为解决一个问题而采起的方法和步骤,称为算法。算法
咱们能够把算法当作一本“福字剪纸教程”,其中每一种算法就是剪纸教程中的一种包含“固定步骤”的剪纸方法,使用者只要按照步骤进行剪纸,就能够剪出好看的福字。数组
之因此有这么多的算法,在于不一样算法解决问题的效率各有不一样,适合不一样的场景。随着问题规模的增加,算法之间的差距会变的不可跨越。提高解决问题的效率,不单单依赖于选择快速的硬件,还依赖于选择有效(适合)的算法。性能
针对数组进行从大到小(或从小到大)的排序。例如:管理系统中按照成绩的排序,按阅读量对文章的排序等。网站
数据快速的计算与排序,与前端页面性能有直接的关系。(譬如在页面中有10000条的数据须要靠JS进行排序,采用不一样的算法所消耗的时间差距甚大,直接影响着网站的用户体验)code
较为常见的排序方法,包括:冒泡排序、选择排序、快速排序、二分法插入排序等。排序
因为排序的算法有不少,在本次“算法系列”的分享当中,咱们先从简单易上手的选择排序法开始,其它的排序算法会随后陆续跟你们一块儿分享。教程
先找到序列中最小的数,将它和序列中第一个数交换位置;索引
接下来,在剩下的序列中继续此操做:找到最小的数,将它和序列中的第二个数交换位置;ip
依此类推,直到将整个序列排序完成。
简言之,选择排序就是 —— 不断地选择剩余序列中的最小者,而后与未排序数列的“第一个”数字交换位置。
以下数组中,黑色表明待排序,蓝色表明已排序
排序次数:序列长度 – 1(注意,不是比较次数);
由于序列中的最后一个数不须要再次比较大小,故排序次数为 序列长度 – 1。
序列中找到最小的数,并记录该数的索引值;
由于minIndex默认开始为0,则第一个数无需与自身比较,因此j = i + 1;
在排序次数内屡次遍历找到最小的数,所以须要再用一个for语句来进行控制。
利用temp变量,实现两数组元素之间数值的交换,也就是交互位置。
算法复杂度分为时间复杂度和空间复杂度(时间和空间是计算机最重要的资源,所以复杂度分为时间和空间)。
时间复杂度:指执行算法所须要的计算工做量;
空间复杂度:指执行算法所须要的内存空间。
时间复杂度是总运算次数表达式中受n的变化影响最大的项(不含系数);
第一次循环比较n-1次,而后是n-2次,n-3次,依此类推,最后一次循环比较1次,总的比较次数和为(n - 1 + 1) * n / 2,即进行比较操做的时间复杂度为O(n^2)
Tips:选择排序的比较次数与序列的初始排序无关。
空间复杂度:O(1)
排序算法须要一个额外的空间(temp变量)来交换元素的位置。
选择排序是一种不稳定排序的算法。
好比:序列[3, 8, 3, 1, 9 ],第一次循环第1个元素3会和1交换,变成[1, 8, 3, 3, 9],此时,原序列中两个3的前后顺序被破坏。