学习js的第十一天

本文详细介绍了三种基本排序算法:冒泡排序、选择排序和快速排序的工作原理,以及如何在JavaScript中实现。此外,还探讨了数组塌陷问题及其两种解决方案,数组去重的四种策略,以及数组的高级方法,如forEach、map、filter等,这些都是JavaScript编程中的重要概念和技术。
摘要由CSDN通过智能技术生成

学习目标:

                 排序


排序内容:

  1. 冒泡排序
  2. 选择排序

  3. 快速排序
  4. 数组塌陷

  5. 数组去重

  6. 数组的高级方法


冒泡:

  1. 从下往上冒,冒到最上面就破掉,结束
  2. 需要好几轮
  3. 每一轮比较好几次
    1. 当前元素 跟后一个元素进行比较
  4. 第一轮 正序能找出最大值 倒序一定能找到最小,
  5. 第二轮 正序能找出倒数第二大值 倒序一定能找到倒数第二小值,
  6. 下一轮一定比上一轮少一次 (通过4 5得出结论)
  7. 口诀
    1. 双重for循环 一层减一次
    2. 里层减外层 变量想交换

总共需要 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


选择排序:

  1. 第一轮 找所有元素的最小值 找到以后跟下标[0]进行交换 第一轮结束

  2. 第二轮 下标0不用参与 从下标1到最后 找最小值 找到最小值以后 跟下标1交换

    第二轮结束

  3. 第三轮 下标0 下标1 不用参与了 下标2开始 到最后 找到最小值 然后跟下标2交换 第三轮结束

  4. 第四轮 下标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 次, 少的是第一次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值