实现思路

  1. 从乱序数组中,每次遍历找到最小值元素的索引,并和头部元素进行交换(升序)
  2. 指针向后走,重复第一步,直到遍历到尾部
    1. function selectionSort(arr) {
    2. let minIndex;
    3. for(let i = 0; i < arr.length; i++) {
    4. minIndex = i;
    5. for (let j = i + 1; j < arr.length; j++) {
    6. if (arr[i] < arr[minIndex]) {
    7. minIndex = i;
    8. }
    9. }
    10. if (i !== minIndex) {
    11. [arr[minIndex], arr[i] ] = [arr[i], arr[minIndex]]
    12. }
    13. }
    14. return arr
    15. }
    16. const arr = [8,0,4,6,1,2,7,3,5,9];

双向指针优化,从左往右找最大, 从右往左找最小,性能提升一倍

  1. const arr = [8,0,4,6,1,2,7,3,5,9];
  2. function selectionSort(arr) {
  3. let left = 0;
  4. let right = arr.length - 1
  5. let min, max ;
  6. while(left < right) {
  7. min = max = left;
  8. for (let i = left +1; i < arr.length - left; i++) {
  9. if (arr[i] > arr[max]) {
  10. max = i
  11. }
  12. if (arr[i] < arr[min]) {
  13. min = i
  14. }
  15. }
  16. if (max !== right) {
  17. swap(arr, max, right)
  18. }
  19. if (min === right) {
  20. min = max;
  21. }
  22. if (min !== left) {
  23. swap(arr, min, left)
  24. }
  25. left++;
  26. right--;
  27. }
  28. return arr;
  29. }
  30. function swap(arr, i, j) {
  31. let temp = arr[i]
  32. arr[i] = arr[j]
  33. arr[j] = temp;
  34. }

练习题

N 叉树的层序遍历。
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
例如,给定一个 3 叉树 :

  1. /*
  2. 1
  3. 3 2 1
  4. 5 6
  5. 返回结果
  6. [
  7. [1],
  8. [3,2,4],
  9. [5,6],
  10. ]
  11. 说明:
  12. 树的深度不会超过 1000。
  13. 树的节点总数不会超过 5000。
  14. */
  15. // 1. 递归
  16. function levelOrder(root) {
  17. let result = []
  18. function helper(node, deep) {
  19. if (node !== null) {
  20. result[deep] = result[deep] || [];
  21. result[deep].push(node.val);
  22. // [ [1], [3,2, 1], [5,6]]
  23. if (node.children.length !== 0) {
  24. let newDeep = deep+1;
  25. node.children.forEach(childNode => {
  26. helper(childNode, newDeep)
  27. })
  28. }
  29. }
  30. }
  31. helper(root, 0)
  32. return result;
  33. }
  34. // 2. 非递归, BFS
  35. var levelOrder = function(root) {
  36. let result = []
  37. if (!root) return result;
  38. let queue = [root]
  39. while(queue.length) {
  40. let level = []
  41. let len = queue.length;
  42. for (let i = 0; i < len; i++) {
  43. let current = queue.shift()
  44. if (current) {
  45. level.push(current.val)
  46. if (current.children && current.children.length > 0) {
  47. queue.push(...current.children)
  48. }
  49. }
  50. }
  51. result.push(level)
  52. }