function insertion_sort(arr) {
//第一位不用去作比较,只有一位的数组可以看作为有序数组
for (var i = 1; i < arr.length; i++) {
insert(arr, i, arr[i]);
}
}
function insert(arr, i, x) {
let p = i - 1; // p 作为被首先比较的元素
// arr[i] 也就是 x 是待插入的元素
while (p >= 0 && arr[p] > x) {
// 当待插入的元素
arr[p + 1] = arr[p];
p--;
}
arr[p + 1] = x;
}
复制代码
选择排序
// 找到第一个最小的,放在第一位
// 再找到第二个最小的, 放在第二位
function select(array) {
var len = array.length;
//第零位到倒数第二位
for (var i = 0; i < len - 1; i++) {
//先认定数组中的第i位是最小的, 再逐次跟后面的作比较
var minnum = array[i];
//第一位到最后一位
for (var j = i + 1; j < len; j++) {
// 如果后面的更小的话, 做值的交换
if (array[j] < minnum) {
//值交换
[array[j], minnum] = [minnum, array[j]]
}
}
//比较过后, 给第i位赋值
array[i] = minnum;
}
}
var arr = [4, 5, 8, 9, 4, 2, 15, 6]
select(arr)
console.log(arr)
复制代码
//将数组分成两个数组,
// 索引 [a,b) 和 [b,c)
//合并函数部分,
function merge(arr, a, b, c) {
// 此时arr1 和 arr2 是 两个有序数组
let arr1 = arr.slice(a, b);
let arr2 = arr.slice(b, c);
//在两个数组后面布置哨兵
arr1.push(Infinity);
arr2.push(Infinity);
//设置两个数组的比较位置的索引的游标索引
// 如果这个数字被赋值,则索引+1
var i = 0, j = 0;
//循环给arr赋值
for (let k = a; k < c; k++) {
//k : 下一个写入位置
//i : arr1中的回写位置
//j : arr2中的回写位置
arr[k] = arr1[i] < arr2[j] ? arr1[i++] : arr2[j++];
}
}
function mergeSort(arr, a, c) {
//判断数组长度是否为1
if (c - a < 2) { return };
const b = Math.ceil((a + c) / 2);
//左侧部分递归
mergeSort(arr, a, b);
//右侧部分递归
mergeSort(arr, b, c);
//执行拼接
merge(arr, a, b, c);
}
// 把数组拆成一个,一个的数组, 在执行拼接
复制代码
双路快速
function quickSort(arr) {
//递归出口,数组长度为0
if (arr.length == 0) return [];
// 建立比较数字, 左侧数组, 右侧数组
var left = [];
var right = [];
var pivot = arr[0];
//从数组第一位开始比较
for (var i = 1; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
// 递归 连接数组, 这个函数是纯函数,结果不会改变原数组。
return quickSort(left).concat(pivot, quickSort(right))
}
let arr = [4, 51, 59, 13, 1, 31, 3, 1, 8];
let result = quickSort(arr);
console.log(result)
复制代码
三路快排
function qSort3(arr) {
if (arr.length == 0) {
return [];
}
//定义三个数组
var left = [];
//三路快排的核心是多了一个中间数组, 中间数组放相等的值,避免了不必要的比较
var center = [];
var right = [];
//设置一个比较值
var pivot = arr[0];
//循环比较部分
for (var i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} elseif (arr[i] == pivot) {
center.push(arr[i]);
} else {
right.push(arr[i]);
}
}
//循环递归 大于比较值的部分和小于比较值的部分
return [...qSort3(left), ...center, ...qSort3(right)];
}
var newArr = qSort3([9, 4, 10, 8, 12, 2, 6, 7, 3, 1, 1, 0, 9, 1, 0])
console.log(newArr)
复制代码
深度克隆
function deepClone2(origin, target) {
var target = target || ((origin instanceof Array) ? [] : {});
for (var prop in origin) {
if (origin.hasOwnProperty(prop)) {
if (typeof origin[prop] == 'object') {
if (Object.prototype.toString.call(origin[prop]) === '[object Array]') {
target[prop] = [];
} else {
target[prop] = {};
}
deepClone2(origin[prop], target[prop]);
} else {
target[prop] = origin[prop]
}
}
}
return target;
}
复制代码
数组扁平化
function platArray(arr) {
var newArr = [];
function pushToArray(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] instanceof Array) {
pushToArray(arr[i])
} else {
newArr.push(arr[i])
}
}
}
pushToArray(arr)
return newArr;
}
console.log(platArray([[1, 2], [[[[3]]]], [{ name: "lyz", info: { age: "24" } }], [4, [5, [6]]]]));
// [1, 2, 3, { name: 'lyz', info: { age: '24' } }, 4, 5, 6]
复制代码
字符串反转
var str = 'abcde';
function strReverse(str) {
// new String 出来的类数组是不能修改某一位的,
// writeable是false;
var strObj = [...new String(str)];
var times = strObj.length / 2 | 0;
for (var i = 0; i < times; i++) {
var y = strObj.length - 1 - i;
[strObj[i], strObj[y]] = [strObj[y], strObj[i]];
}
return strObj.join('');
}
console.log(strReverse(str));
复制代码
观察 者模式
//es6
class Event {
constructor() {
this.cache = {};
}
on(type, handle) {
if (!this.cache[type]) {
this.cache[type] = [handle];
} else {
this.cache[type].push(handle)
}
}
// 执行某一个type下面的全部函数
emmit() {
// argiments 第一位是type类型, 其余几位是函数用的参数
//获取type
var type = arguments[0];
// 获取参数,
var arg = [].slice.call(arguments, 1);
// 依次执行数组里面的函数
for (var i = 0; i < this.cache[type].length; i++) {
this.cache[type][i].apply(this, arg)
}
}
//清空某一个type数组
empty(type) {
this.cache[type] = [];
}
// 清空指定的type数组里面的指定的hanle
remove(type, handle) {
var infos = this.cache[type];
if (!infos) returnfalse;
if (!handle) {
infos && (infos.length = 0);
} else {
for (var i = 0, len = infos.length; i < len; i++) {
if (infos[i] === handle) {
infos.splice(i, 1);
}
}
}
}
}
复制代码