实现思路
- 从乱序数组中,每次遍历找到最小值元素的索引,并和头部元素进行交换(升序)
- 指针向后走,重复第一步,直到遍历到尾部
function selectionSort(arr) {let minIndex;for(let i = 0; i < arr.length; i++) {minIndex = i;for (let j = i + 1; j < arr.length; j++) {if (arr[i] < arr[minIndex]) {minIndex = i;}}if (i !== minIndex) {[arr[minIndex], arr[i] ] = [arr[i], arr[minIndex]]}}return arr}const arr = [8,0,4,6,1,2,7,3,5,9];
双向指针优化,从左往右找最大, 从右往左找最小,性能提升一倍
const arr = [8,0,4,6,1,2,7,3,5,9];function selectionSort(arr) {let left = 0;let right = arr.length - 1let min, max ;while(left < right) {min = max = left;for (let i = left +1; i < arr.length - left; i++) {if (arr[i] > arr[max]) {max = i}if (arr[i] < arr[min]) {min = i}}if (max !== right) {swap(arr, max, right)}if (min === right) {min = max;}if (min !== left) {swap(arr, min, left)}left++;right--;}return arr;}function swap(arr, i, j) {let temp = arr[i]arr[i] = arr[j]arr[j] = temp;}
练习题
N 叉树的层序遍历。
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
例如,给定一个 3 叉树 :
/*13 2 15 6返回结果[[1],[3,2,4],[5,6],]说明:树的深度不会超过 1000。树的节点总数不会超过 5000。*/// 1. 递归function levelOrder(root) {let result = []function helper(node, deep) {if (node !== null) {result[deep] = result[deep] || [];result[deep].push(node.val);// [ [1], [3,2, 1], [5,6]]if (node.children.length !== 0) {let newDeep = deep+1;node.children.forEach(childNode => {helper(childNode, newDeep)})}}}helper(root, 0)return result;}// 2. 非递归, BFSvar levelOrder = function(root) {let result = []if (!root) return result;let queue = [root]while(queue.length) {let level = []let len = queue.length;for (let i = 0; i < len; i++) {let current = queue.shift()if (current) {level.push(current.val)if (current.children && current.children.length > 0) {queue.push(...current.children)}}}result.push(level)}
