JavaScript的排序算法——选择排序

0 人评论
  作者: Avrit   分类:学习   浏览:41

选择排序(Selection Sort)

选择排序是一种排序算法,是一个占用常用内存(In-place)的排序方法。时间复杂度为O(n2)。通常情况下,在处理大型数据的时候,性能要比相似的插入排序低。选择排序因其简单性而著称,并且在某些情况下性能要优于更复杂的算法,尤其是在辅助存储空间有限的情况下。

原理

选择排序的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。

选择排序(Selection Sort)

选择排序(Selection Sort)

复杂度

算法 最好情况 平均情况 最坏情况 空间复杂度 稳定性
选择排序 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的排序算法——快速排序

mongoose --- populate主要操作以及简单和$lookup对比

0 人评论
  作者: Avrit   分类:学习   浏览:45
简单的创建声明三张表:user/department/project

const UserSchema = new mongoose.Schema({
  username: { type: String, required: true },
  password: { type: String, required: true },

阅读全文>>

JS中substr与substring的区别

0 人评论
  作者: Avrit   分类:学习   浏览:40
js中substr和substring都是截取字符串中子串,非常相近,可以有一个或两个参数。

语法:substr(start [,length]) 第一个字符的索引是0,start必选 length可选

   substring(start [, end]) 第一个字符的索引是0,start必选 end可选

相同点:当有一个参数时,两者的功能是一样的,返回从start指定的位置直到字符串结束的子串

var str = "hello Tony";

str.substr(6);  //Tony

str.substring(6); //Tony

 

不同点:有两个参数时

(1)substr(start,length) 返回从start位置开始length长度的子串

“goodboy”.substr(1,6);   //oodboy

【注】当length为0或者负数,返回空字符串

(2)substring(start,end) 返回从start位置开始到end位置的子串(不包含end)

“goodboy”.substring(1,6);  //oodbo

【注】:

(1)substring 方法使用 start 和 end 两者中的较小值作为子字符串的起始点

(2)start 或 end 为 NaN 或者负数,那么将其替换为0

另外:ECMA 并没有对 substr() 进行标准化,所以并不建议使用 substr()

Object.prototype.toString.call()方法

0 人评论
  作者: Avrit   分类:学习   浏览:45

在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是原生的,否则不是;

express 的app.use()和app.all()的区别

0 人评论
  作者: Avrit   分类:学习   浏览:30
app.use()接受一个或者多个回调函数作为中间件。中间件通常不处理请求和响应(技术上可以处理)。中间件往往处理输入数据然后传递请求到下一个中间件。比如处理 header,cookies,sessions等。
执行顺序按照书写顺序。必须写在app[method]之前,否则不执行。

阅读全文>>

chrome console控制台引入jquery库

0 人评论
  作者: Avrit   分类:学习   浏览:349
有时候我们要在控制台需要jquery来做一样东西,但是无奈是页面并没有引入jquery库。
这时候我们需要手动在控制台添加自己jquery类库

var importJs=document.createElement('script')  //在页面新建一个script标签
importJs.setAttribute("type","text/javascript")  //给script标签增加type属性
importJs.setAttribute("src", 'https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js') //给script标签增加src属性, url地址为cdn公共库里的
document.getElementsByTagName("head")[0].appendChild(importJs)//把importJs标签添加在页面

JS 使用html2canvas实现截图功能的问题记录和解决方案

0 人评论
  作者: Avrit   分类:学习   浏览:444

在实现“截图”功能时,遇到几个bug,研究了一个上午,终于全部解决了;


下面给大家分享下:


1、"图片资源跨域",导致无法截图。

浏览器会提示下面的错误


DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

阅读全文>>

JS document.execCommand实现复制功能

0 人评论
  作者: Avrit   分类:学习   浏览:322

最近项目中需要实现功能:点击button,复制input框的值;


我使用的是 document.execCommand('copy')的方法;


但是很郁闷的是,始终实现不了功能;代码如下

阅读全文>>

PHP与Javascript的两种交互方式

0 人评论
  作者: Avrit   分类:PHP   浏览:2046
在网页制作过程中怎样在不刷新页面的情况下使前台页面和 
后台CGI页面保持交互一直是个问题。这里介绍两个我在实践中使 
用的方法。 

    方法一:通过Cookie交互。一共是三个文件,分别为: 
index.htm,action.php,main.htm 

阅读全文>>

完美IE6 fixed解决方案

0 人评论
  作者: Avrit   分类:学习   浏览:1664
目前网上有的比较多的是这种解决方案(纯CSS):
       html{overflow:hidden;}
       body{height:100%;overflow:auto;}
       #rightform form{position:absolute;right:30px;top50px;}
  这个方法有一个bug未解决:在IE6下会把所有position:absolute都变成“浮动”的元素;还有使用js方法滚动滚动条时会出现对象闪烁,如下方法结合了CSS和js的办法,解决了以上的问题。

阅读全文>>