学习目标:
排序
排序内容:
- 冒泡排序
-
选择排序
- 快速排序
-
数组塌陷
-
数组去重
-
数组的高级方法
冒泡:
- 从下往上冒,冒到最上面就破掉,结束
- 需要好几轮
- 每一轮比较好几次
- 当前元素 跟后一个元素进行比较
- 第一轮 正序能找出最大值 倒序一定能找到最小,
- 第二轮 正序能找出倒数第二大值 倒序一定能找到倒数第二小值,
- 下一轮一定比上一轮少一次 (通过4 5得出结论)
- 口诀
- 双重for循环 一层减一次
- 里层减外层 变量想交换
总共需要 length -1轮
每一轮 需要 length-1-轮数 次
i == 0 第0轮 少 0次 length-1-i
i ==1 第1轮 少1次 length-1-i
i==2 第2轮 少2次 length-1-i
选择排序:
-
第一轮 找所有元素的最小值 找到以后跟下标[0]进行交换 第一轮结束
-
第二轮 下标0不用参与 从下标1到最后 找最小值 找到最小值以后 跟下标1交换
第二轮结束
-
第三轮 下标0 下标1 不用参与了 下标2开始 到最后 找到最小值 然后跟下标2交换 第三轮结束
-
第四轮 下标0 下标1 下标2 都不用参与了 下标3开始到最后 找到最小值 然后跟下标3交换
找最小值 假设 min = 下标0是最小值 从下标1到最后 挨个跟min比较 ,如果比它小
替换min中的值
规律:
第几轮 跟谁交换 假设最小值的索引 从下标几开始循环
快速排序:
1.从数组中选择一个基准元素 pivot 2.将所有小于 基准元素的元素 移动到 pivot 的左边 将所有大于 基准元素的元素 移动到 pivot 的右边 3. 对基准元素 两侧的数组 进行递归调用 ( 左右的数组分别找出一个基准元素 大于基准元素的放右边 小于的放左边 ) 4. 直到子序列中仅剩下一个元素位置 5. 将所有的子序列拼接起来 就能得到排序好的数组 // 递归 // concat
数组塌陷:
// var ages = [3, 10, 18, 20,20,20,20,30, 40, 50, 60, 70, 80, 90, 100]; // 0 1 2 3 4 5 // // 删除数组中的20 // for(var k in ages){ // if(ages[k] == 20){ // ages.splice(k,1); // } // } // 4个20只删除了 两个 两个没有被删除 这就是数组塌陷 // console.log(ages); // 解决方案 1 从后往前删除 // for(var i=ages.length-1; i>=0; i--){ // if(ages[i] == 20){ // ages.splice(i,1); // } // } // console.log(ages); // 解决方案 2 从前往后删除 // 只要遇到20 删除 这次数从新开始 // var ages = [3, 10, 18, 20,20,20,20,30, 40, 50, 60, 70, 80, 90, 100]; // for(var i=0;i<ages.length;i++){ // if(ages[i] == 20){ // ages.splice(i,1); // i--; // 遇到20 删除 这次数从新开始 // } // } // console.log(ages);
数组去重:
// 数组去重 var ages = [3, 10, 18, 20, 20, 20, 20, 30, 40, 40, 10, 3, 50, 60, 70, 80, 90, 100]; // 方案1 // 准备一个空数组 // 遍历原数组 // 判断新数组中是否有这个元素 没有才往新数组中添加 // var newAges = []; // for (var i = 0; i < ages.length; i++) { // if (newAges.indexOf(ages[i]) == -1) { // newAges.push(ages[i]); // } // } // console.log(newAges); // 方案2 // 先排序 // 挨个遍历 前后比较 如果两个一样 删除一个 // 一直到最后一个元素 // 排序 // ages.sort(function(a,b){ // return a-b; // }); // // 遍历排序后的数组 // for(var i=0;i<ages.length;i++){ // if(ages[i] == ages[i+1]){ // ages.splice(i,1); // 下一个元素补到前一个元素的位置 // // 索引一直往后走 // // 保证每个元素都能被遍历到 // i--; // } // } // console.log(ages); // 方案3 // 直接遍历 不排序 // 从当前元素开始往后找 如果有相同的就删除 // 数组.indexOf(元素,开始查找的位置) // for(var i=0;i<ages.length;i++){ // var index = ages.indexOf(ages[i],i+1); // // 从当前元素的下一个位置开始查找 直到最后 // // 查看是否有相同的元素 // if(index != -1){ // ages.splice(index,1); // 如果有相同的元素 就删除 // i--; // } // } // console.log(ages); // 方案4 // 新的数据结构 集合 Set // 集合的数据特点: // 1. 无序的 // 2. 没有重复的元素 每个元素只能出现一次 // 3 长的像数组 但是不是数组 // 数组转集合语法: new Set([数据1,数据2,数据3,...,数据n]) // 集合 => 数组 // 语法1: Array.from(集合); // 语法2: 使用展开运算符 ... 例子 [... 集合] // var myset = new Set(ages); // 数组转集合 // var arr2 = Array.from(myset); // 语法1 集合转数组 // var arr3 = [...myset]; // 语法2 集合转数组 // console.log(arr2); // console.log(arr3); // ... 运算符 // 1. 展开运算符 可以展开可迭代对象 // 什么是可迭代对象: // 只要支持遍历的对象都是可迭代对象 // var newAges = [...ages]; // console.log(newAges);
数组的高级方法:
1.push() 2.pop() 3.unshift() 4.shift() 改变原数组 5.reverse() 6.sort() 7.splice() ----------------------------------- 8.concat() 9.join() 不改变原数组 10.indexOf() 11.lastIndexOf() 12.slice() // es5新增的方法 解决问题的时候可以使用 // 13-20参数是个匿名函数 13. forEach() + 语法: 数组.forEach( function (item, index, origin) {} ) // item index origin 不需要每次全写 // item必须写 // item 第一个位置 // index 第二个位置 // origin 第三个位置 // 每个位置的名字用户可以自己决定 => item: 表示数组的每一项 => index: 表示数组每一项的索引 => origin: 表示原始数组 + 作用: 遍历数组 + 返回值: 没有(undefined) 14. map() > 当数组的每一样都要执行相同的操作 那么使用map > 结果是一个新的数组 不会对原数组产生影响 + 语法: 数组.map( function (item, index, origin) {} ) => item: 表示数组的每一项 => index: 表示数组每一项的索引 => origin: 表示原始数组 + 作用: 映射数组 + 返回值: 和原始数组长度一样的数组, 只不过内部数据经过映射加工 + 注意: 映射条件以 return 的形式书写 15. filter() // 对数组的元素进行筛选 // 不影响原数组 + 语法: 数组.filter( function (item, index, origin) {} ) => item: 表示数组的每一项 => index: 表示数组每一项的索引 => origin: 表示原始数组 + 作用: 过滤数组 + 返回值: 必然是一个新数组, 内部存储的是原始数组内过滤出来的部分数据 + 注意: 过滤条件以 return 的形式书写 16. find() + 语法: 数组.find( function (item, index, origin) {} ) => item: 表示数组的每一项 => index: 表示数组每一项的索引 => origin: 表示原始数组 + 作用: 在原始数组内查找满足条件的第一项 + 返回值: 找到的数据 + 注意: 查找条件以 return 的形式书写 17. findIndex() + 语法: 数组.findIndex( function (item, index, origin) {} ) => item: 表示数组的每一项 => index: 表示数组每一项的索引 => origin: 表示原始数组 + 作用: 在原始数组内查找满足条件的第一项的索引 + 返回值: 找到的数据的索引 + 注意: 查找条件以 return 的形式书写 18. every() + 语法: 数组.every( function (item, index, origin) {} ) => item: 表示数组的每一项 => index: 表示数组每一项的索引 => origin: 表示原始数组 + 作用: 判断数组内是否每一个都满足条件 + 返回值: 一个布尔值 => true, 说明数组内每一个数据都满足条件 => false, 说明数组内至少有一个是不满足条件的 + 注意: 判断条件以 return 的形式书写 19. some() + 语法: 数组.some( function (item, index, origin) {} ) => item: 表示数组的每一项 => index: 表示数组每一项的索引 => origin: 表示原始数组 + 作用: 判断数组内是否有某一个满足条件 + 返回值: 一个布尔值 => true, 说明数组内至少有某一个是满足条件的 => false, 说明数组内所有的项都不满足条件 + 注意: 判断条件以 return 的形式书写 20. reduce() + 语法: 数组.reduce(function (prev, item, index, origin) {}, init) // init 可写可不写 但是影响结果 => prev: 表示初始值或者上一次的运算结果 => item: 表示数组的每一项 => index: 表示数组每一项的索引 => origin: 表示原始数组 + 作用: 用来实现叠加效果 + 返回值: 最终叠加结果 + 注意: 叠加条件以 return 的形式书写 + 注意: prev 的值, 如果你传递了 init, 就是 init 的值, 如果你没有传递 init, 那么就是数组 [0] 的值 + 注意: 如果你传递了 init, 循环执行 length 次, 如果你没有传递 init, 循环执行 length - 1 次, 少的是第一次