选择排序(Selection Sort)
选择排序是一种排序算法,是一个占用常用内存(In-place)的排序方法。时间复杂度为O(n2)。通常情况下,在处理大型数据的时候,性能要比相似的插入排序低。选择排序因其简单性而著称,并且在某些情况下性能要优于更复杂的算法,尤其是在辅助存储空间有限的情况下。
原理
选择排序的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。
复杂度
算法 | 最好情况 | 平均情况 | 最坏情况 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 |
ES6实现
function SelectionSort(originalArray) { const array = [...originalArray]; let len = array.length; for (let i = 0; i < len - 1; i++) { let minIndex = i; for (let j = i + 1; j < len; j++) { if (array[j] < array[minIndex]) { minIndex = j; } } if (minIndex != i) { [array[minIndex], array[i]] = [array[i], array[minIndex]] } } return array; }
参考
相关阅读
JavaScript的排序算法——冒泡排序
JavaScript的排序算法——选择排序
JavaScript的排序算法——插入排序
JavaScript的排序算法——归并排序
JavaScript的排序算法——快速排序
在JavaScript里使用
typeof判断数据类型
,只能区分基本类型,即:number、string、undefined、boolean、object
。
对于null、array、function、object来说,使用typeof都会统一返回object字符串。
要想区分对象、数组、函数、单纯使用typeof是不行的。在JS中,可以通过Object.prototype.toString方法
,判断某个对象之属于哪种内置类型。
分为null、string、boolean、number、undefined、array、function、object、date、math。
1. 判断基本类型
Object.prototype.toString.call(null); // "[object Null]" Object.prototype.toString.call(undefined); // "[object Undefined]" Object.prototype.toString.call(“abc”);// "[object String]" Object.prototype.toString.call(123);// "[object Number]" Object.prototype.toString.call(true);// "[object Boolean]"
2. 判断原生引用类型
**函数类型** Function fn(){ console.log(“test”); } Object.prototype.toString.call(fn); // "[object Function]"
**日期类型** var date = new Date(); Object.prototype.toString.call(date); // "[object Date]"
**数组类型** var arr = [1,2,3]; Object.prototype.toString.call(arr); // "[object Array]"
**正则表达式** var reg = /[hbc]at/gi; Object.prototype.toString.call(reg); // "[object RegExp]"
**自定义类型** function Person(name, age) { this.name = name; this.age = age; } var person = new Person("Rose", 18); Object.prototype.toString.call(arr); // "[object Object]"
无法区分自定义对象类型,自定义类型可以采用instanceof区分
console.log(person instanceof Person); // true
3.判断原生JSON对象
var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON); console.log(isNativeJSON);//输出结果为”[object JSON]”说明JSON是原生的,否则不是;
app.use()
接受一个或者多个回调函数作为中间件
。中间件通常不处理请求和响应(技术上可以处理)。中间件往往处理输入数据然后传递请求到下一个中间件。比如处理 header,cookies,sessions等。执行顺序
按照书写顺序。必须写在app[method]
之前,否则不执行。在实现“截图”功能时,遇到几个bug,研究了一个上午,终于全部解决了;
下面给大家分享下:
1、"图片资源跨域",导致无法截图。
浏览器会提示下面的错误
DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.
后台CGI页面保持交互一直是个问题。这里介绍两个我在实践中使
用的方法。
方法一:通过Cookie交互。一共是三个文件,分别为:
index.htm,action.php,main.htm
html{overflow:hidden;}
body{height:100%;overflow:auto;}
#rightform form{position:absolute;right:30px;top50px;}
这个方法有一个bug未解决:在IE6下会把所有position:absolute都变成“浮动”的元素;还有使用js方法滚动滚动条时会出现对象闪烁,如下方法结合了CSS和js的办法,解决了以上的问题。