1. 冒泡排序
/** 目标:* 1. 理解冒泡排序思路* 2. 理解冒泡排序的代码实现* *//** 冒泡排序的思路:数组的相邻两项互相比较,如果前一项比后一项大,就交换两项的位置。否则什么也不做;这样每两个比较过一轮后,可以得出本轮的一个最大值。** 冒泡排序研究两个问题:* 1. 需要比较的轮数;每一轮都会产生一个最大值,所以只需要比 length - 1 轮就可以比完,因为最后一个一定是最小的* 2. 每一轮比较的次数:* 第1轮需要比较 length - 1 - 0 次* 第2轮需要比较 length - 1 - 1 次(因为前面已经得出一个最大值,第二轮比较的时候不需要在和前面得出的最大值比较了)* 第3轮需要比较 length - 1 - 2次 (有2个最大值)* 第4轮需要比较 length - 1 - 3次* */var ary = [5, 4, 3, 2, 1]; // [4, 3, 2, 1, 5];for (var i = 0; i < ary.length - 1; i++) { for (var j = 0; j < ary.length - 1 - i; j++) { if (ary[j] > ary[j + 1]) { var temp = ary[j]; ary[j] = ary[j + 1]; ary[j + 1] = temp; } }}console.log(ary);
2. 递归
/** 目标:* 1. 理解函数递归* 2. 理解递归语法* 3. 理解递归终止的意义** */function oneToTen() { var total = 0; for (var i = 1; i <= 10; i++) { total += i; } return total;}// 递归写法:function rOneToTen(num) { if (num === 10) { // 使用递归时一定要考虑清楚何时终止递归 return 10 } return num + rOneToTen(num + 1) // return 1 + rOneToTen(2) // return 1 + 2 + rOneToTen(3) // return 1 + 2 + 3 + rOneToTen(4) // return 1 + 2 + 3 + 4 + rOneToTen(5) // return 1 + 2 + 3 + 4 + 5 + rOneToTen(6) // return 1 + 2 + 3 + 4 + 5 + 6 + rOneToTen(7) // return 1 + 2 + 3 + 4 + 5 + 6 + 7 + rOneToTen(8) // return 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + rOneToTen(9) // return 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + rOneToTen(10) // return 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 // 55}console.log(rOneToTen(1));// 需求:求出1-10中是3的倍数的所有数字之和function timesOfThree() { var total = 0; for (var i = 1; i <= 10; i++) { if (i % 3 === 0) { total += i; } } return total;}function rTimesOfThree(num) { if (num === 10) { return 0 } if (num % 3 === 0) { return num + rTimesOfThree(num + 1); } else { return rTimesOfThree(num + 1) } // return rTimesOfThree(2) // return rTimesOfThree(3) // return 3 + rTimesOfThree(4) // return 3 + rTimesOfThree(5) // return 3 + 6 + rTimesOfThree(7) // return 3 + 6 + rTimesOfThree(8) // return 3 + 6 + rTimesOfThree(9) // return 3 + 6 + 9 + rTimesOfThree(10) // return 3 + 6 + 9 + 0 // 18}console.log(rTimesOfThree(1));
3. 通过递归数组排序
/** 目标:* 1. 理解快速排序的原理* 2. 理解递归在快速排序中的应用* */var ary = [12, 8, 88, 97, 86, 85];// left [12, 8, 88, 86, 85] |97| right []// left [12, 8, 86, 85] |88| right [] |97| []// left [12, 8, 85] |86| right [] |88| [] |97| []// left [] |8| right [12, 85] |86| [] |88| [] |97| []// [] |8| left [12] |85| right [] |86| [] |88| [] |97| []// [8, 12, 85, 86, 88, 97]// 快速排序的原理:声明两个新数组,分别叫做 left 和 right,然后获取数组的中中间项,然后比中间项小的放在 left 中,然后比中间项大的放在 right 中。然后对 left 和 right 进行同样的操作,直到 left 或者 right 只有一项或者为空时,终止这个过程,然后把所有的 left 和 right 以及中间项拼接起来function quickSort(ary) { // !!! 使用递归要注意递归终止的条件,当前数组 ary 剩余一项或者为空时,就要停止递归 if (ary.length <= 1) { return ary; } // 1. 计算中间项索引 var midIndex = Math.floor(ary.length / 2); // 2. 获取中间项 var midVal = ary.splice(midIndex, 1)[0]; // 3. for 循环遍历数组,如果当前项比中间项大就 push 到 right var left = []; var right = []; for (var i = 0; i < ary.length; i++) { var cur = ary[i]; if (cur > midVal) { right.push(cur); } else { left.push(cur); } } return quickSort(left).concat(midVal, quickSort(right))}console.log(quickSort(ary));
4. 插入排序
/** 插入排序:* 1. 理解插入排序原理;* 2. 理解插入排序实现* *//** 插入排序原理:* 1. 假定第一项是最小值;* 2. 从第二项开始倒着和前面的项进行比较* 3. 如果前面一项比后一项大,则交换位置* */var ary = [5, 4, 3, 2, 1];function insertSort(ary) { for (var i = 1; i < ary.length; i++) { for (var j = i; j >= 0; j--) { if (ary[j - 1] > ary[j]) { var temp = ary[j]; ary[j] = ary[j - 1]; ary[j - 1] = temp; } } } return ary;}console.log(insertSort(ary));