UNPKG

wk_utils

Version:

一个轻便、快捷、实用的成长型自定义工具函数库

194 lines (160 loc) 32.2 kB
/* * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["wkUtils"] = factory(); else root["wkUtils"] = factory(); })(self, function() { return /******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "./src/array/difference.js": /*!*********************************!*\ !*** ./src/array/difference.js ***! \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"difference\": () => (/* binding */ difference)\n/* harmony export */ });\n/**\r\n * 求多个数组的差异\r\n * 例如:[1,3,5,7] [5,8] [7,9] ==> [1,3]\r\n */\r\nfunction difference(leftArr, ...arrays){\r\n if(leftArr.length === 0){\r\n return []\r\n }else if(arrays === 0){\r\n return [...leftArr]\r\n }\r\n\r\n return leftArr.filter(item => {\r\n let result = true\r\n\r\n for(let i = 0; i < arrays.length; i++){\r\n const index = arrays[i].indexOf(item);\r\n if(index !== -1){\r\n result = false;\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n })\r\n}\n\n//# sourceURL=webpack://wkUtils/./src/array/difference.js?"); /***/ }), /***/ "./src/array/flatten.js": /*!******************************!*\ !*** ./src/array/flatten.js ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"flatten\": () => (/* binding */ flatten),\n/* harmony export */ \"flatten_while\": () => (/* binding */ flatten_while)\n/* harmony export */ });\n/**\r\n * 递归 + reduce 实现数组扁平化\r\n */\r\nfunction flatten(array){\r\n return array.reduce((prev,item)=>{\r\n !Array.isArray(item) ? prev.push(item) : prev.push(...flatten(item))\r\n \r\n return prev;\r\n }, []) \r\n \r\n}\r\n\r\n/**\r\n * while + concat 实现数组扁平化\r\n */\r\nfunction flatten_while(array){\r\n let resultArr = [].concat(...array);\r\n while(resultArr.some(item => Array.isArray(item))){\r\n resultArr = [].concat(...resultArr)\r\n }\r\n return resultArr; \r\n}\n\n//# sourceURL=webpack://wkUtils/./src/array/flatten.js?"); /***/ }), /***/ "./src/array/merge.js": /*!****************************!*\ !*** ./src/array/merge.js ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"mergeArray\": () => (/* binding */ mergeArray)\n/* harmony export */ });\n/**\r\n * 合并多个数组\r\n * 例如:[1,3,5,7] [5,8] [7,9] ==> [1,3,5,7,8,9]\r\n */\r\nfunction mergeArray(leftArr, ...arrays){\r\n const result = [...leftArr];\r\n if(leftArr.length === 0){\r\n return result;\r\n }\r\n\r\n arrays.forEach(arr =>{\r\n arr.forEach(item =>{\r\n if(result.indexOf(item) === -1){\r\n result.push(item)\r\n }\r\n })\r\n })\r\n\r\n return result;\r\n}\n\n//# sourceURL=webpack://wkUtils/./src/array/merge.js?"); /***/ }), /***/ "./src/array/unique.js": /*!*****************************!*\ !*** ./src/array/unique.js ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"unique_for\": () => (/* binding */ unique_for),\n/* harmony export */ \"unique_set\": () => (/* binding */ unique_set)\n/* harmony export */ });\n/**\r\n * forEach 实现 数组去重\r\n */\r\nfunction unique_for(array){\r\n const resultArr = [];\r\n const contain = {};\r\n\r\n array.forEach(element => {\r\n if(!contain.hasOwnProperty(element)){\r\n resultArr.push(element);\r\n contain[element] = true;\r\n }\r\n });\r\n \r\n return resultArr;\r\n}\r\n\r\n/**\r\n * ES6 语法 Set 实现 数组去重\r\n */\r\nfunction unique_set(array){ \r\n return [... new Set(array)];\r\n}\n\n//# sourceURL=webpack://wkUtils/./src/array/unique.js?"); /***/ }), /***/ "./src/function/function.js": /*!**********************************!*\ !*** ./src/function/function.js ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"throttle\": () => (/* binding */ throttle),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce)\n/* harmony export */ });\n/**\r\n * 函数节流\r\n * 用来返回节流函数的工具函数\r\n */\r\nfunction throttle(callback, delay){\r\n // 默认第一次点击时调用\r\n let preTime = 0;\r\n return function(){\r\n const currentTime = Date.now();\r\n // 距离上次调用 callback 的时间差必须大于 delay 才会被调用\r\n if(currentTime - preTime > delay){\r\n callback.apply(this, arguments);\r\n // 记录此次调用的时间\r\n preTime = currentTime;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 函数防抖\r\n * 用来返回节流函数的工具函数\r\n */\r\nfunction debounce(callback, delay){\r\n return function(){\r\n // 如果上次事件还没有真正处理,则取消掉\r\n if(callback.hasOwnProperty('timer')){\r\n // 清除掉\r\n clearTimeout(callback.timer) \r\n }\r\n // 启动定时器,准备处理\r\n callback.timer = setTimeout(() => {\r\n // 事件发生指定时间后才调用处理事件的处理函数\r\n callback.apply(this, arguments);\r\n // 标记事件已经真正处理,则删除准备处理的标记\r\n delete callback.timer\r\n }, delay);\r\n \r\n }\r\n}\n\n//# sourceURL=webpack://wkUtils/./src/function/function.js?"); /***/ }), /***/ "./src/index.js": /*!**********************!*\ !*** ./src/index.js ***! \**********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bubbleSort\": () => (/* reexport safe */ _sort_sort__WEBPACK_IMPORTED_MODULE_0__.bubbleSort),\n/* harmony export */ \"selectionSort\": () => (/* reexport safe */ _sort_sort__WEBPACK_IMPORTED_MODULE_0__.selectionSort),\n/* harmony export */ \"quickSort\": () => (/* reexport safe */ _sort_sort__WEBPACK_IMPORTED_MODULE_0__.quickSort),\n/* harmony export */ \"insterSort\": () => (/* reexport safe */ _sort_sort__WEBPACK_IMPORTED_MODULE_0__.insterSort),\n/* harmony export */ \"insterSort_for\": () => (/* reexport safe */ _sort_sort__WEBPACK_IMPORTED_MODULE_0__.insterSort_for),\n/* harmony export */ \"shellSort\": () => (/* reexport safe */ _sort_sort__WEBPACK_IMPORTED_MODULE_0__.shellSort),\n/* harmony export */ \"mergeSort\": () => (/* reexport safe */ _sort_sort__WEBPACK_IMPORTED_MODULE_0__.mergeSort),\n/* harmony export */ \"Stack\": () => (/* reexport safe */ _stack_stack_js__WEBPACK_IMPORTED_MODULE_1__.default),\n/* harmony export */ \"dec2bin\": () => (/* reexport safe */ _stack_stack_js__WEBPACK_IMPORTED_MODULE_1__.dec2bin),\n/* harmony export */ \"Queue\": () => (/* reexport safe */ _queue_queue_js__WEBPACK_IMPORTED_MODULE_2__.default),\n/* harmony export */ \"passGame\": () => (/* reexport safe */ _queue_queue_js__WEBPACK_IMPORTED_MODULE_2__.passGame),\n/* harmony export */ \"PriorityQueue\": () => (/* reexport safe */ _queue_priorityQueue_js__WEBPACK_IMPORTED_MODULE_3__.PriorityQueue),\n/* harmony export */ \"throttle\": () => (/* reexport safe */ _function_function_js__WEBPACK_IMPORTED_MODULE_4__.throttle),\n/* harmony export */ \"debounce\": () => (/* reexport safe */ _function_function_js__WEBPACK_IMPORTED_MODULE_4__.debounce),\n/* harmony export */ \"unique_for\": () => (/* reexport safe */ _array_unique_js__WEBPACK_IMPORTED_MODULE_5__.unique_for),\n/* harmony export */ \"unique_set\": () => (/* reexport safe */ _array_unique_js__WEBPACK_IMPORTED_MODULE_5__.unique_set),\n/* harmony export */ \"flatten\": () => (/* reexport safe */ _array_flatten_js__WEBPACK_IMPORTED_MODULE_6__.flatten),\n/* harmony export */ \"flatten_while\": () => (/* reexport safe */ _array_flatten_js__WEBPACK_IMPORTED_MODULE_6__.flatten_while),\n/* harmony export */ \"difference\": () => (/* reexport safe */ _array_difference_js__WEBPACK_IMPORTED_MODULE_7__.difference),\n/* harmony export */ \"mergeArray\": () => (/* reexport safe */ _array_merge_js__WEBPACK_IMPORTED_MODULE_8__.mergeArray),\n/* harmony export */ \"mergeObject\": () => (/* reexport safe */ _object_merge_js__WEBPACK_IMPORTED_MODULE_9__.mergeObject),\n/* harmony export */ \"deepClone\": () => (/* reexport safe */ _object_merge_js__WEBPACK_IMPORTED_MODULE_9__.deepClone)\n/* harmony export */ });\n/* harmony import */ var _sort_sort__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sort/sort.js */ \"./src/sort/sort.js\");\n/* harmony import */ var _stack_stack_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stack/stack.js */ \"./src/stack/stack.js\");\n/* harmony import */ var _queue_queue_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./queue/queue.js */ \"./src/queue/queue.js\");\n/* harmony import */ var _queue_priorityQueue_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./queue/priorityQueue.js */ \"./src/queue/priorityQueue.js\");\n/* harmony import */ var _function_function_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./function/function.js */ \"./src/function/function.js\");\n/* harmony import */ var _array_unique_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./array/unique.js */ \"./src/array/unique.js\");\n/* harmony import */ var _array_flatten_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./array/flatten.js */ \"./src/array/flatten.js\");\n/* harmony import */ var _array_difference_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./array/difference.js */ \"./src/array/difference.js\");\n/* harmony import */ var _array_merge_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./array/merge.js */ \"./src/array/merge.js\");\n/* harmony import */ var _object_merge_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./object/merge.js */ \"./src/object/merge.js\");\n\r\n\r\n/**\r\n * 入口 JS\r\n * 向外暴露工具函数\r\n */\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\n\n//# sourceURL=webpack://wkUtils/./src/index.js?"); /***/ }), /***/ "./src/object/merge.js": /*!*****************************!*\ !*** ./src/object/merge.js ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"mergeObject\": () => (/* binding */ mergeObject),\n/* harmony export */ \"deepClone\": () => (/* binding */ deepClone)\n/* harmony export */ });\n/* harmony import */ var _sort_sort__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../sort/sort */ \"./src/sort/sort.js\");\n\r\n\r\n/**\r\n * 合并多个对象\r\n */\r\nfunction mergeObject(...objs){\r\n let result = {};\r\n objs.forEach( obj => {\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key];\r\n // result 中没有此属性\r\n if(!result.hasOwnProperty(key)){\r\n result[key] = value;\r\n }else{\r\n // result 中已有次属性\r\n result[key] = [].concat(result[key], value)\r\n }\r\n })\r\n })\r\n return result;\r\n}\r\n\r\n/**\r\n * 深拷贝\r\n * 解决属性丢失 和 循环引用问题\r\n */\r\nfunction deepClone(target, map = new Map()){\r\n // 处理的目标是 数组 / 对象\r\n if(target instanceof Array || (target !== null && typeof target === 'object')){\r\n // map 中若存在克隆对象则直接返回,即解决循环引用问题\r\n let cloneObj = map.get(target);\r\n if(cloneObj){\r\n // 一个对象只能克隆一次\r\n return cloneObj;\r\n }\r\n // 创建克隆对象\r\n if( target instanceof Array ){\r\n cloneObj = [];\r\n // 保存到 map 容器里\r\n map.set(target, cloneObj); \r\n // 数组不用用 for in , 因会查找原型链,会影响遍历效率\r\n target.forEach((item, index) =>{\r\n cloneObj[index] = deepClone[item, map]\r\n })\r\n }else{\r\n cloneObj = {};\r\n // 保存到 map 容器里\r\n map.set(target, cloneObj);\r\n for (let key in target) {\r\n if( target.hasOwnProperty(key) ){\r\n cloneObj[key] = deepClone(target[key], map)\r\n }\r\n }\r\n }\r\n \r\n // 返回克隆对象\r\n return cloneObj;\r\n }else{\r\n return target;\r\n }\r\n}\n\n//# sourceURL=webpack://wkUtils/./src/object/merge.js?"); /***/ }), /***/ "./src/queue/priorityQueue.js": /*!************************************!*\ !*** ./src/queue/priorityQueue.js ***! \************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"PriorityQueue\": () => (/* binding */ PriorityQueue)\n/* harmony export */ });\n/**\r\n * 自定义一个优先级的队列\r\n */\r\nfunction PriorityQueue() {\r\n // 用于保存元素数据的数组,结构为 { data, priority }\r\n const arr = [];\r\n\r\n // 队列每个元素的类型\r\n function QueueElement(data, priority) {\r\n this.data = data;\r\n this.priority = priority;\r\n }\r\n\r\n // 入队列\r\n this.enQueue = function (data, priority) {\r\n // priority 必须在 0 ~ 100 之间\r\n if (priority < 0 || priority > 100) {\r\n throw new Error('优先级的值必须在 0~100 之间')\r\n }\r\n // 创建一个新元素\r\n const element = new QueueElement(data, priority);\r\n // 将 element 添加到内部的 arr 中\r\n // 如果当前是空的直接添加\r\n if (arr.length === 0) {\r\n arr.push(element)\r\n }\r\n // 将当前 element 插入到 arr 中的一个合适位置:\r\n // 在 priority 值大于当前值的左边\r\n else {\r\n for (let index = 0; index < arr.length; index++) {\r\n if (arr[index].priority > priority) {\r\n arr.splice(index, 0, element)\r\n return;\r\n }\r\n }\r\n // 如果 for 循环没有结束,则当前的 priority 是最大的\r\n arr.push(element)\r\n }\r\n }\r\n\r\n // 出队列\r\n this.deQueue = function () {\r\n return arr.shift()\r\n }\r\n\r\n // 查看队列头\r\n this.front = function () {\r\n return arr[0];\r\n }\r\n\r\n // 队列中元素个数\r\n this.size = function () {\r\n return arr.length;\r\n }\r\n\r\n // 是否是空队列\r\n this.isEmpty = function () {\r\n return arr.length === 0;\r\n }\r\n}\n\n//# sourceURL=webpack://wkUtils/./src/queue/priorityQueue.js?"); /***/ }), /***/ "./src/queue/queue.js": /*!****************************!*\ !*** ./src/queue/queue.js ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"passGame\": () => (/* binding */ passGame)\n/* harmony export */ });\n/**\r\n * 向外导出\r\n */\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Queue);\r\n\r\n/**\r\n * 利用队列实现 击鼓传花 的游戏\r\n */\r\nfunction passGame(arr, number) {\r\n // 创建一个空的 queue\r\n const queue = new Queue();\r\n // 将数组中所有元素(name,index)依次放入 queue 中\r\n arr.forEach((item, index) => {\r\n queue.enQueue({ item, index })\r\n });\r\n\r\n // 只要队列的 size 大于 1 \r\n while (queue.size() > 1) {\r\n // 将队列的前 number -1 元素依次转入到队列的最后\r\n for (let i = 0; i < number - 1; i++) {\r\n queue.enQueue(queue.deQueue());\r\n }\r\n // 删除头元素\r\n queue.deQueue()\r\n }\r\n\r\n // 最后剩下的就是那个目标\r\n const { item, index } = queue.front();\r\n console.log(`胜利的是${item}, 它是第${index}`)\r\n}\r\n\r\n/**\r\n * 自定义实现队列类型\r\n * 用 JS 模拟实现\r\n */\r\nfunction Queue() {\r\n // 用于保存元素数据的数组\r\n const arr = [];\r\n\r\n // 入队列\r\n this.enQueue = function (element) {\r\n arr.push(element)\r\n }\r\n\r\n // 出队列\r\n this.deQueue = function () {\r\n return arr.shift()\r\n }\r\n\r\n // 查看队列头\r\n this.front = function () {\r\n return arr[0];\r\n }\r\n\r\n // 队列中元素个数\r\n this.size = function () {\r\n return arr.length;\r\n }\r\n\r\n // 是否是空队列\r\n this.isEmpty = function () {\r\n return arr.length === 0;\r\n }\r\n}\r\n\n\n//# sourceURL=webpack://wkUtils/./src/queue/queue.js?"); /***/ }), /***/ "./src/sort/sort.js": /*!**************************!*\ !*** ./src/sort/sort.js ***! \**************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bubbleSort\": () => (/* binding */ bubbleSort),\n/* harmony export */ \"selectionSort\": () => (/* binding */ selectionSort),\n/* harmony export */ \"quickSort\": () => (/* binding */ quickSort),\n/* harmony export */ \"insterSort\": () => (/* binding */ insterSort),\n/* harmony export */ \"insterSort_for\": () => (/* binding */ insterSort_for),\n/* harmony export */ \"shellSort\": () => (/* binding */ shellSort),\n/* harmony export */ \"mergeSort\": () => (/* binding */ mergeSort)\n/* harmony export */ });\n\r\n/**\r\n * 冒泡排序\r\n * 1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个;\r\n * 2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;\r\n * 3. 针对所有的元素重复以上的步骤,除了最后一个;\r\n * 4. 重复步骤1~3,直到排序完成。\r\n */\r\nfunction bubbleSort(arr) {\r\n const len = arr.length;\r\n for (let i = 0; i < len; i++) {\r\n for (let j = i + 1; j < len; j++) {\r\n arr[j] < arr[i] ? [arr[j], arr[i]] = [arr[i], arr[j]] : '';\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\n/**\r\n * 选择排序\r\n * 1. n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:\r\n * 2. 初始状态:无序区为R[1..n],有序区为空;\r\n * 3. 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;\r\n * 4. n-1趟结束,数组有序化了。\r\n */\r\nfunction selectionSort(arr) {\r\n let minIndex;\r\n const len = arr.length;\r\n for (let i = 0; i < len; i++) {\r\n minIndex = i;\r\n for (let j = i + 1; j < len; j++) {\r\n // 寻找最小的数\r\n if (arr[j] < arr[minIndex]) {\r\n // 寻找最小的索引\r\n minIndex = j;\r\n }\r\n }\r\n [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]\r\n }\r\n return arr;\r\n}\r\n\r\n/**\r\n * 快速排序\r\n * 1. 从数列中挑出一个元素,称为 “基准”(pivot);\r\n * 2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;\r\n * 3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。\r\n */\r\nfunction quickSort(arr) {\r\n if (arr.length == 0) return arr;\r\n const len = arr.length;\r\n // 取出中间点及索引\r\n let pirotIndex = Math.floor(len / 2),\r\n pirot = arr.splice(pirotIndex, 1)[0],\r\n left = [], right = [];\r\n\r\n // 遍历出比中间点大 和 小的两个数组\r\n for (let i = 0; i < len; i++) {\r\n arr[i] < pirot ? left.push(arr[i]) : right.push(arr[i]);\r\n }\r\n\r\n return quickSort(left).concat(pirot, quickSort(right))\r\n}\r\n\r\n/**\r\n * 插入排序法 (默认while实现)\r\n * 1. 从第一个元素开始,该元素可以默认为已经被排序;\r\n * 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;\r\n * 3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;\r\n * 4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;\r\n * 5. 将新元素插入到该位置后;\r\n * 6. 重复步骤2~5\r\n */\r\nfunction insterSort(arr) {\r\n let preIndex, current;\r\n const len = arr.length;\r\n // 假定第一个元素已经排好序\r\n for (let i = 1; i < len; i++) {\r\n // 当前值\r\n current = arr[i];\r\n // 当前索引的前一个\r\n preIndex = i - 1;\r\n // 将 current 与左边的从右向左比\r\n while (preIndex >= 0 && arr[preIndex] > current) {\r\n arr[preIndex + 1] = arr[preIndex];\r\n preIndex--;\r\n }\r\n // 将 current 插入到当前位置右边\r\n arr[preIndex + 1] = current;\r\n }\r\n\r\n return arr;\r\n}\r\n\r\n/**\r\n * 用 for 循环实现插入排序\r\n */\r\nfunction insterSort_for(arr) {\r\n const len = arr.length;\r\n // 假定第一个元素已经排好序\r\n for (let i = 0; i < len; i++) {\r\n // 当前值\r\n const current = arr[i];\r\n // 将 current 与左边的从右向左比\r\n let j;\r\n for (j = i - 1; j >= 0; j--) {\r\n if (arr[j] > current) {\r\n // 所有比 current 大的值都要向右移一位\r\n arr[j + 1] = arr[j];\r\n } else {\r\n break;\r\n }\r\n }\r\n // 将 current 插入到当前位置右边\r\n arr[j + 1] = current;\r\n }\r\n\r\n return arr;\r\n}\r\n\r\n/**\r\n * 希尔排序( 增量排序 )\r\n * 1. 有个概念:粗排序\r\n * 2. 计算出一系列的增量值( 一般是 折半法 ),递减,最后必须是 1\r\n * distance = arr.length ( 默认 )\r\n * distance = Math.floor(distance/2) 向下取整\r\n * 3. 以当前增量对数组进行分组,分成多个小数组\r\n * 对每个小数组进行插入排序,且每个小数组的排序是交替进行的\r\n */\r\nfunction shellSort(arr) {\r\n const len = arr.length;\r\n let distance = len;\r\n while (distance > 1) {\r\n distance = Math.floor(distance / 2);\r\n let current, preIndex;\r\n // 遍历未排序的区域\r\n for (let i = distance; i < len; i++) {\r\n current = arr[i];\r\n preIndex = i - distance;\r\n // 将 current 与左边的依次从右向左比\r\n while (preIndex >= 0 && arr[preIndex] > current) {\r\n // 向右移位\r\n arr[preIndex + distance] = arr[preIndex];\r\n preIndex -= distance;\r\n }\r\n arr[preIndex + distance] = current;\r\n }\r\n }\r\n return arr;\r\n}\r\n\r\n/**\r\n * 归并排序\r\n * 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。\r\n * 1. 把长度为n的输入序列分成两个长度为n/2的子序列;\r\n * 2. 对这两个子序列分别采用归并排序;\r\n * 3. 将两个排序好的子序列合并成一个最终的排序序列\r\n */\r\nfunction mergeSort(arr) {\r\n function megerArr(arr) {\r\n const len = arr.length;\r\n if (len < 2) return arr;\r\n\r\n let middle = Math.floor(len / 2),\r\n left = arr.slice(0, middle),\r\n right = arr.slice(middle)\r\n\r\n return merge(megerArr(Object.assign([], left)), Object.assign([], megerArr(right)));\r\n };\r\n\r\n function merge(left, right) {\r\n let result = [];\r\n while (left.length > 0 && right.length > 0) {\r\n if (left[0] <= right[0]) {\r\n // 取出 left 数组第一个数组\r\n result.push(left.shift());\r\n } else {\r\n // 取出 right 数组第一个数组\r\n result.push(right.shift());\r\n }\r\n }\r\n\r\n while (left.length) {\r\n result.push(left.shift())\r\n }\r\n\r\n while (right.length) {\r\n result.push(right.shift())\r\n }\r\n\r\n return result;\r\n }\r\n\r\n return megerArr(arr);\r\n}\n\n//# sourceURL=webpack://wkUtils/./src/sort/sort.js?"); /***/ }), /***/ "./src/stack/stack.js": /*!****************************!*\ !*** ./src/stack/stack.js ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"dec2bin\": () => (/* binding */ dec2bin)\n/* harmony export */ });\n/**\r\n * 向外导出\r\n */\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Stack);\r\n\r\n/**\r\n * 十进制转二进制\r\n * @param {十进制数} decNum \r\n */\r\nfunction dec2bin(decNum) {\r\n // 创建一个用于保存二进制的 stack\r\n const stack = new Stack();\r\n // 对 decNum 不断除2取余,并保存至 stack 中\r\n while (decNum > 0) {\r\n // 除2 取余\r\n const remainder = decNum % 2;\r\n // 放入栈中\r\n stack.push(remainder);\r\n // 除2取整,使自己变小\r\n decNum = Math.floor(decNum / 2);\r\n }\r\n // 依次取出 stack 中的所有元素,并拼接成字符串\r\n let result = '';\r\n // 遍历 stack 中取出\r\n while (!stack.isEmpty()) {\r\n // 从后往前依次取出\r\n result += stack.pop();\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * 自定义实现栈类型\r\n * 用 JS 模拟实现\r\n */\r\nfunction Stack() {\r\n // 用于保存元素数据的数组\r\n const arr = [];\r\n\r\n // 压栈\r\n this.push = function (element) {\r\n arr.push(element)\r\n }\r\n\r\n // 出栈\r\n this.pop = function () {\r\n return arr.pop()\r\n }\r\n\r\n // 查看栈项\r\n this.peek = function () {\r\n return arr[arr.length - 1];\r\n }\r\n\r\n // 栈中元素个数\r\n this.size = function () {\r\n return arr.length;\r\n }\r\n\r\n // 是否是空栈\r\n this.isEmpty = function () {\r\n return arr.length === 0;\r\n }\r\n}\r\n\n\n//# sourceURL=webpack://wkUtils/./src/stack/stack.js?"); /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(__webpack_module_cache__[moduleId]) { /******/ return __webpack_module_cache__[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /************************************************************************/ /******/ // module exports must be returned from runtime so entry inlining is disabled /******/ // startup /******/ // Load entry module and return exports /******/ return __webpack_require__("./src/index.js"); /******/ })() ; });