1. 冒泡排序

  1. /*
  2. * 目标:
  3. * 1. 理解冒泡排序思路
  4. * 2. 理解冒泡排序的代码实现
  5. * */
  6. /*
  7. * 冒泡排序的思路:数组的相邻两项互相比较,如果前一项比后一项大,就交换两项的位置。否则什么也不做;这样
  8. 每两个比较过一轮后,可以得出本轮的一个最大值。
  9. *
  10. * 冒泡排序研究两个问题:
  11. * 1. 需要比较的轮数;每一轮都会产生一个最大值,所以只需要比 length - 1 轮就可以比完,因为最后一个一
  12. 定是最小的
  13. * 2. 每一轮比较的次数:
  14. * 第1轮需要比较 length - 1 - 0 次
  15. * 第2轮需要比较 length - 1 - 1 次(因为前面已经得出一个最大值,第二轮比较的时候不需要在和前面得出
  16. 的最大值比较了)
  17. * 第3轮需要比较 length - 1 - 2次 (有2个最大值)
  18. * 第4轮需要比较 length - 1 - 3次
  19. * */
  20. var ary = [5, 4, 3, 2, 1]; // [4, 3, 2, 1, 5];
  21. for (var i = 0; i < ary.length - 1; i++) {
  22. for (var j = 0; j < ary.length - 1 - i; j++) {
  23. if (ary[j] > ary[j + 1]) {
  24. var temp = ary[j];
  25. ary[j] = ary[j + 1];
  26. ary[j + 1] = temp;
  27. }
  28. }
  29. }
  30. console.log(ary);

2. 递归

  1. /*
  2. * 目标:
  3. * 1. 理解函数递归
  4. * 2. 理解递归语法
  5. * 3. 理解递归终止的意义
  6. *
  7. * */
  8. function oneToTen() {
  9. var total = 0;
  10. for (var i = 1; i <= 10; i++) {
  11. total += i;
  12. }
  13. return total;
  14. }
  15. // 递归写法:
  16. function rOneToTen(num) {
  17. if (num === 10) {
  18. // 使用递归时一定要考虑清楚何时终止递归
  19. return 10
  20. }
  21. return num + rOneToTen(num + 1)
  22. // return 1 + rOneToTen(2)
  23. // return 1 + 2 + rOneToTen(3)
  24. // return 1 + 2 + 3 + rOneToTen(4)
  25. // return 1 + 2 + 3 + 4 + rOneToTen(5)
  26. // return 1 + 2 + 3 + 4 + 5 + rOneToTen(6)
  27. // return 1 + 2 + 3 + 4 + 5 + 6 + rOneToTen(7)
  28. // return 1 + 2 + 3 + 4 + 5 + 6 + 7 + rOneToTen(8)
  29. // return 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + rOneToTen(9)
  30. // return 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + rOneToTen(10)
  31. // return 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 // 55
  32. }
  33. console.log(rOneToTen(1));
  34. // 需求:求出1-10中是3的倍数的所有数字之和
  35. function timesOfThree() {
  36. var total = 0;
  37. for (var i = 1; i <= 10; i++) {
  38. if (i % 3 === 0) {
  39. total += i;
  40. }
  41. }
  42. return total;
  43. }
  44. function rTimesOfThree(num) {
  45. if (num === 10) {
  46. return 0
  47. }
  48. if (num % 3 === 0) {
  49. return num + rTimesOfThree(num + 1);
  50. } else {
  51. return rTimesOfThree(num + 1)
  52. }
  53. // return rTimesOfThree(2)
  54. // return rTimesOfThree(3)
  55. // return 3 + rTimesOfThree(4)
  56. // return 3 + rTimesOfThree(5)
  57. // return 3 + 6 + rTimesOfThree(7)
  58. // return 3 + 6 + rTimesOfThree(8)
  59. // return 3 + 6 + rTimesOfThree(9)
  60. // return 3 + 6 + 9 + rTimesOfThree(10)
  61. // return 3 + 6 + 9 + 0 // 18
  62. }
  63. console.log(rTimesOfThree(1));

3. 通过递归数组排序

  1. /*
  2. * 目标:
  3. * 1. 理解快速排序的原理
  4. * 2. 理解递归在快速排序中的应用
  5. * */
  6. var ary = [12, 8, 88, 97, 86, 85];
  7. // left [12, 8, 88, 86, 85] |97| right []
  8. // left [12, 8, 86, 85] |88| right [] |97| []
  9. // left [12, 8, 85] |86| right [] |88| [] |97| []
  10. // left [] |8| right [12, 85] |86| [] |88| [] |97| []
  11. // [] |8| left [12] |85| right [] |86| [] |88| [] |97| []
  12. // [8, 12, 85, 86, 88, 97]
  13. // 快速排序的原理:声明两个新数组,分别叫做 left 和 right,然后获取数组的中中间项,然后比中间项小的放在 left 中,然后比中间项大的放在 right 中。然后对 left 和 right 进行同样的操作,直到 left 或者 right 只有一项或者为空时,终止这个过程,然后把所有的 left 和 right 以及中间项拼接起来
  14. function quickSort(ary) {
  15. // !!! 使用递归要注意递归终止的条件,当前数组 ary 剩余一项或者为空时,就要停止递归
  16. if (ary.length <= 1) {
  17. return ary;
  18. }
  19. // 1. 计算中间项索引
  20. var midIndex = Math.floor(ary.length / 2);
  21. // 2. 获取中间项
  22. var midVal = ary.splice(midIndex, 1)[0];
  23. // 3. for 循环遍历数组,如果当前项比中间项大就 push 到 right
  24. var left = [];
  25. var right = [];
  26. for (var i = 0; i < ary.length; i++) {
  27. var cur = ary[i];
  28. if (cur > midVal) {
  29. right.push(cur);
  30. } else {
  31. left.push(cur);
  32. }
  33. }
  34. return quickSort(left).concat(midVal, quickSort(right))
  35. }
  36. console.log(quickSort(ary));

4. 插入排序

  1. /*
  2. * 插入排序:
  3. * 1. 理解插入排序原理;
  4. * 2. 理解插入排序实现
  5. * */
  6. /*
  7. * 插入排序原理:
  8. * 1. 假定第一项是最小值;
  9. * 2. 从第二项开始倒着和前面的项进行比较
  10. * 3. 如果前面一项比后一项大,则交换位置
  11. * */
  12. var ary = [5, 4, 3, 2, 1];
  13. function insertSort(ary) {
  14. for (var i = 1; i < ary.length; i++) {
  15. for (var j = i; j >= 0; j--) {
  16. if (ary[j - 1] > ary[j]) {
  17. var temp = ary[j];
  18. ary[j] = ary[j - 1];
  19. ary[j - 1] = temp;
  20. }
  21. }
  22. }
  23. return ary;
  24. }
  25. console.log(insertSort(ary));