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);
}
}
}
}
}
複製代碼