冒泡排序、插入法排序及选择排序
冒泡排序、插入法排序以及选择排序是排序算法中比较基础的三种,其平均时间复杂度都是O(n^2)。
原理介绍冒泡排序冒泡排序的步骤是:比较相邻两个数,看是否满足大小关系,如果不满足则交换这两个数,使他们满足大小关系,这样可以保证最大(最小)的数始终会向后流动,循环一次之后,最大(最小)的数就会被交换到数组的最后。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。
插入法排序插入法排序的思路是:把数组分成两个部分:排好序的,和未排序的。开始的时候,数组的第一个元素会被当做拍好序的部分,对其余未排好序的数值进行迭代,将其插入到排好序的部分中合适的位置。
选择法排序选择法排序和插入法排序类似,都是将数组分为排好序的和未排序的两个部分。不同的是,选择法排序每次迭代都会选择未排序部分中的最小(最大)值,将其插入到排好序部分的队首(队尾)。
C语言实现需要实现四个函数, 第一个是打印数组,接下来三个函数分别实现三种排序算法:
void print_arry(int *a, int len)
static inline void insertion_ ...
用单链表实现LRU缓存置换算法
缓存置换算法所解决的问题在存储系统的金字塔结构中,缓存的存取速度比内存快,然而成本比内存高,所以缓存的容量有限。缓存置换算法所要解决的问题便是在容量有限的缓存中,存放哪些数据可以提升缓存命中率。
LRU缓存置换算法的核心思想LRU算法认为最近访问过的数据被再次访问的可能性最大,所以缓存中存放的是最近使用过的数据。具体的做法是:
把缓存当做一个队列,队首的数据是最近被访问的数据,而队尾的数据则是即将被置换出缓存的数据。
每当有新数据被访问时,会在队列中查找该数据,如果存在,就被该数据挪到队首。
如果被访问的数据没有在队列(缓存)中,而且缓存未满,则该数据被放到队首。
如果被访问的数据没有在队列中,然而缓存已经满了,则把队尾的数据从队列中删除,再把新数据放置到队首。
用C语言实现LRU缓存置换算法1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 ...
ES6: Set 与 Map
Set
let my_set = new Set();
let my_set = new Set([1, 1, 2, 2]);
my_set.add(5);
my_set.delete(5);
my_set.has(5);
my_set.forEach(function(value){});
let my_set = WeakSet() // 只允许对象作为set的元素,便于垃圾回收
Map
let my_map = new Map();
let map = new Map([[“name”, “Nicholas”], [“age”, 25]]);
my_map.set(key, value);
my_map.get(key)
my_map.has(key)
my_map.delete(key);
my_map.clear();
my_map.size;
my_map.forEach(function(value, key, ownerMap) { console.log(key + “ “ + value); co ...
ES6: 符号类型
引入原因:
实现私有属性 let s = Symbol() let obj = {[s]: ‘hello world’}; console.log(obj.s); //undefined
符号值唯一 let s = Symbol() let m = Symbol() console.log(s === m)
创建:
不能用字面量形式创建
使用Symbol(desc)函数创建,不需要添加new
Symbol.for(key)在全局符号注册表中查找key符号值,如果找到就返回,没找到就创建一个新的符号值
Symbol.keyFor(symbol): 返回符号值的key
枚举:
符号类型的key是不能被枚举的,Object.keys()以及Object.getOwnPropertyNames()都不能返回符号类型的key
Object.getOwnPropertySymbols()则会返回对象中所有符号类型的key
共享符号值:
Symbol.for(desc): 在全局符号注册表中查找描述为desc的符号,如果找到,返回这个符号值,如果 ...
ES6: 对象和数组解构
所谓解构,指的是将数据结构分解为更小的部分,从而使数据提取变得容易。 对象解构:
使用解构时,必须提供初始化值 let Person = { name: 'sen', age: 18 } let {name, age} = Person;
解构表达式的值为=右侧的值
如果对象中没有同名属性时,解构表达式新赋值的变量的值为undefined
解构对象只是赋值时,需要加()
赋值给不同名的变量 let Person = { name: 'sen', age: 18 } let {name: localName, age: localAge} = Person;
设置默认值 let Person = { name: 'sen', age: 18 } let {name, age: localAge = 18} = Person;
嵌套解构 let Person = { name: ...
ES6: 对象扩展
初始化简写: function createPerson(name, age) { return { name: name, age: age }; } ---> function createPerson(name, age) { return { name, age }; }
方法简写: var person = { name: "sen", sayName: function() { return this.name; } }---> var person = { name: "sen", sayName() { return this.name; } }
需要计算的属性名用[]表示
Object.is() 与===表现相同,除了 Object.is(NaN, NaN) // true Object.is(+0, -0) // false
Obj ...
ES6: 函数扩展
带默认值参数的函数:var get_name = function(url, id=1, callback){};
如果传入了第二个参数,将不会使用默认值
如果给第二个参数赋值为undefined,会使用默认值
带有默认值的参数后,arguments的内容将不会随着形参的改变而改变
排在后面的参数可以将前面的参数作为默认值,而前面的参数不能引用后面的参数作为默认值
剩余参数:var get_name = function(url, …keys)
除了第一个参数url外,剩余所有参数都会被放到keys数组中
函数只能有一个剩余参数,且必须放到最后
剩余参数不能在对象字面量的setter属性中使用
延展运算符:var args = ['url', 123, 'st']; get_names(...args);
new.target: 使用new创建一个对象时,会被赋值为新对象的构造器
ES6允许在代码块中定义函数,在严格模式中,块级函数只能在块级作用域中使用,而非严格模式中,块级函数会被提升到全局
箭头函数
...
ES6: 字符串处理
UTF-16编码:
str.codePointAt(index)
String.fromCodePoint(codepoint);
normalize()
正则表达式
新增u修饰符用来处理UTF-16编码的问题 /&.$/u
新增pattern.flags 属性 // ‘ig’
新增pattern.sticky 属性及’y’修饰符 // 只从lastIndex处匹配,如果和’g’一起存在则’g’被忽略
复制正则表达式 // let pattern = new RegEX(old_pattern, ‘gi’)
字符串处理
str.includes(sub_string) // true or false
str.startsWith(sub_string) // true or false
str.endsWith(sub_string) // true or false
str.repeat(times); // str * times
模板字面量
支持多行字符串
支持变量 // `hello ${name ...
ES6: 块级作用域
var
没有块级作用域的概念
会被提升到定义函数的顶部
可以重复声明
let
有块级作用域
不会被提升
禁止重复声明
const
有块级作用域
不会被提升
禁止重复声明
其值不可更改
必须进行初始化
Javascript中的表单
var form = document.getElementById(‘myform’);
form.acceptCharset 服务器能处理的字符集
form.action 接受请求的URL
form.elements 表单中的所有控件
form.enctype 编码类型
form.length 控件数量
form.method HTTP请求类型
form.name // document.forms[form.name]
form.reset()
form.submit()
form.target
var text = form.elements[‘sex’];
text.disabled
text.form
text.name
text.value
text.readOnly
text.tabIndex
text.type
text.select()
text.setSelectionRange(start, end)
text.value.substring(text.selectionS ...