排序算法
快排
- 算法原理是分治
- 取数组中的中间值为标杆,小于或大于这个标杆的分别放入不同数组left 和 right
- 分别快排这两个新数组,利用递归实现分治
- 排到底时,分出的数组最终只有一个值,合并所有值就行了
- 这就是空间换时间的思想
Array.prototype.quickSort = function quickSort() {if (this.length <= 1) return this;let middleIndex = Math.floor(this.length / 2);let middleValue = this.splice(middleIndex, 1)[0];let left = [], right = [];for (let i = 0; i < this.length; i++) {let item = this[i];item < middleValue ? left.push(item) : right.push(item);}return quickSort.call(left).concat(middleValue, quickSort.call(right));};let arr = [2, 1, 3, 7, 5];console.log(arr.quickSort());
归并排序
和快排基本一致,也是利用分治思想
不同的是,归并是在递归的归的时候实现排序,而快排是在递的过程中排序
function merge(left, right) {let result = [];// 比较左右两个数组的第一个元素,小的就推入结果数组,直到其中一个数组为空while (left.length > 0 && right.length > 0) {left[0] <= right[0] ? result.push(left.shift()): result.push(right.shift());}// 因为左右两个数组一定是已经分别排好序了,所以剩下一个不为空的数组FIFO推到结果数组result就行了、while (left.length > 0) {result.push(left.shift());}while (right.length > 0) {result.push(right.shift());}return result;}Array.prototype.mergeSort = function mergeSort() {if (this.length <= 1) return this;let middleIndex = Math.floor(this.length / 2);let left = this.slice(0, middleIndex); // 左边的数组let right = this.slice(middleIndex); // 右边的数组// 继续分别对左右两个数组进行归并排序,最终合并结果return merge(mergeSort.call(left), mergeSort.call(right));};console.log(arr.mergeSort());
数组去重的4种方法
includes法
let ary = [1, 2, 3, 1, 2, 1, 2, 3, 2, 1, 2, 3];let newAry = [];for (let i = 0; i < ary.length; i++) {let item = ary[i];if (newAry.includes(item)) {continue;}newAry.push(item);}console.log(newAry);
for循环依次比较筛除法
let ary = [1, 2, 3, 1, 2, 1, 2, 3, 2, 1, 2, 3];for (let i = 0; i < ary.length; i++) {let item = ary[i];for (let j = i + 1; j < ary.length; j++) {let compare = ary[j];if (compare === item) {ary.splice(j, 1);j--;}}}console.log(ary);
对象去重法
function unique(ary) {let obj = {};for (let i = 0; i < ary.length; i++) {let item = ary[i];if (obj[item] !== undefined) {ary.splice(i, 1);continue;}obj[item] = item;}return ary;}let aa = [1, 1, 2, 3, 3, 4, 1];aa = unique(aa);console.log(aa);
Set去重法
let aa = [1, 1, 2, 3, 3, 4, 1];console.log(new Set(aa));
数组扁平化的5种方式
let arr = [[1, 2, 2],[3, 4, 5, 5],[6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
flat
字符串化与数组化
调用toSring转为字符串,再拼接成数组,注意需要再转回数字类型
let arr = [[1, 2, 2],[3, 4, 5, 5],[6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];arr = arr.toString().split(',').map(item => {return Number(item);});
序列化
arr = JSON.stringify(arr).replace(/(\[|\])/g, '').split(',').map(item => Number(item));
使用展开运算符+concat拼接数组
// 只要数组中存在数组,就不断展开并concat拼接数组while (arr.some(item => Array.isArray(item))) {arr = [].concat(...arr);console.log(arr);}
深度递归遍历
Array.prototype.myFlat = function () {const res = [];const fn = arr => {arr.forEach(item => {Array.isArray(item) ? fn(item) : res.push(item);});};fn(this);return res;};console.log(arr.myFlat());
数组的交差并补
let arr1 = [1, 2, 3, 4, 5],arr2 = [5, 6, 7, 8, 9],_arr1Set = new Set(arr1),_arr2Set = new Set(arr2);// 交集let intersection = arr1.filter(item => _arr2Set.has(item));// 并集let union = Array.from(new Set([...arr1, ...arr2]));// 补集 两个数组各自没有的集合let complement = [...arr1.filter(item => !_arr2Set.has(item)),...arr2.filter(item => !_arr1Set.has(item))];// 差集 数组arr1相对于arr2所没有的let diff = arr1.filter(item => !_arr2Set.has(item));
