数组的算法

冒泡排序

一种较为简单的排序算法,它会重复的走访需要排序的数列,每一次比较两个元素,如果它们的顺序错误就会被调转过来,从而达到正确排序的作用,最后的结果就会呈现按照一定规律(从大到小/从小到大)排序的现象。

特点:

1,如果有n个数字,则需要排序n-1轮

2,每一轮都需要比较n-i次,i表示第几轮

   /*冒泡排序:总共需要 arr.length-1 轮每一轮需要比较 arr.length-当前轮数(轮数从1开始)*/  var arr = [12,2,190,64,56,63,29];for( var i=0;i<arr.length;i++ ){// 外层循环控制轮数for( var j=0;j<arr.length-i;j++ ){// 内层循环控制每一轮的次数if( arr[j]<arr[j+1] ){ // 升序var temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}console.log( arr );//[190, 64, 63, 56, 29, 12, 2]
​for(let i = 0 ;i <arr.length;i++){for(let j =0;j <arr.length-i;j++){if(arr[j]>arr[j+1]){let temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}console.log(arr);// [2, 12, 29, 56, 63, 64, 190]

二分法查找

二分法查找适用于数据量较大时,但是数据需要先排好顺序。

具体思路:

要求数组必须是有序的。

将查找的项目和数组的中间的值比较,如果大取右边,如果小取左边,这样就可以一次性筛选掉一半的数据。

再次查找,还是和剩余的一半的中间值比较,再次帅选掉一半

重复执行,最终找到结果。

需求:封装一个函数,查找某一个元素是否存在数组中,如果存在就返回索引,如果不存在就返回-1。

    // 二分法:要求数组必须是有序的   var arr = [1,23,34,45,56,67,78,89,90,100,101,102,156,178,209];function erfen(arr,ele){// 定义最小索引var minIndex = 0// 定义最大索引var maxIndex = arr.length-1;// 算出中间索引var midIndex = (minIndex+maxIndex)/2// 判断条件while( minIndex<=maxIndex ){if( arr[midIndex] === ele ){return midIndex;}else if( ele>arr[midIndex] ){// 更新最小索引minIndex = midIndex+1;}else{// 更新最小索引maxIndex = midIndex-1;}// 更新中间索引midIndex = (minIndex+maxIndex)/2}return -1;}var index = erfen(arr,178);console.log(index);
​function erfen(arr,num){let minIndex=0;let maxIndex = arr.length-1;let midIndex = (minIndex +maxIndex)/2while(minIndex <= maxIndex){if(arr[midIndex] === num){return midIndex;}else if(midIndex < num){minIndex = midIndex+1;}else{maxIndex =midIndex -1;}midIndex = (minIndex +maxIndex)/2}return -1}let result = erfen(arr,3);console.log(result);

数组去重

程序可能会需要一个元素值相对唯一的数组,这样我们就需要将数组中重复的值剔除出去。

   // 数组去重var arr = [11,2,2,2,'hello','world','hello'];// 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中var newArr = [];for( var i=0;i<arr.length;i++ ){if( !newArr.includes( arr[i] ) ){newArr.push(arr[i])}}console.log( newArr );//[11, 2, "hello", "world"]
//方法2for(let i =0 ; i <arr.length;i++){if(!newArr.includes(arr[i])){newArr[newArr.length] = arr[i]}}console.log( newArr );//[11, 2, "hello", "world"]

数组求差集/交集/并集

思路:利用indexOf或者includes方法。

var arr1 = [1,2,3];
var arr2 = [2,3,4,5];
var arr3 = [];
//并集 arr3 = [1,2,3,4,5]
//思路:合并数组,再去重
function bing(arr1,arr2){var arr4 = arr1.concat(arr2);for(var i = 0; i<arr4.length;i++){//如果在arr3中找不到arr4的值,就把arr4的值push进arr3if( arr3.indexOf(arr4[i])){arr3.push(arr4[i])}}return arr3
}
var result = bing(arr1,arr2)
console.log(result);//[1, 2, 3, 2, 3, 4, 5]//交集 arr3 = [2,3]
//思路:返回两个数组相同的数
arr3 = arr1.filter(function(num) {return arr2.indexOf(num) !== -1;
});
console.log(arr3);//[2, 3]//差集 arr3 = [1,4,5]
//思路,合并数组,筛选arr3
arr3 = arr1.concat(arr2).filter(function(num) {return !arr1.includes(num) || !arr2.includes(num)
});
console.log(arr3);//[1,4,5]

基本数据类型和引用数据类型区别

    // 基本数据类型var n1 = 10;var n2 = n1;n2 = 20;console.log( n1 );// 10console.log( n2 );// 20
​// 引用数据类型var arr1 = [1,2,3];var arr2 = arr1;arr2.push( 4 );console.log( arr1 );// [1,2,3,4]console.log( arr2 );// [1,2,3,4]console.log( arr1 === arr2 );

练习2

    // 1. 三个算法:冒泡,二分,去重//2.冒泡:如果有n个数字,则需要排序n-1轮,每一轮都需要比较n-i次,i表示第几轮//3.封装一个函数,查找某一个元素是否存在数组中,如果存在就返回索引,如果不存在就返回-1。//4.程序可能会需要一个元素值相对唯一的数组,这样我们就需要将数组中重复的值剔除出去。新建一新数组,遍历传入数组,值不在新数组就push进该新数组中

答案2

//冒泡
var arr = [34,12,45,33,99,1]
//方法1 普通排序
//确定几轮,确定每轮比较次数
for(var i = 0; i <arr.length; i++){//每个数字都要比较n-i次for(var j = 0; j < arr.length - i ; j++){if(arr[j] > arr[j+1]){//升序//交换var temp;temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp}}
}
// console.log(arr);//[1, 12, 33, 34, 45, 99]
​
//方法2 函数实现,实现一次封装,多次调用
var arr1 = [22,14,33,23,67,34]
var arr2 = [43,11,23,65]
//封装函数
function upSort(xx){//复制上述代码for(var i = 0; i <xx.length; i++){//每个数字都要比较n-i次for(var j = 0; j < xx.length - i ; j++){if(xx[j] > xx[j+1]){//升序//交换var temp;temp = xx[j];xx[j] = xx[j+1];xx[j+1] = temp}}
}
console.log(xx);
}
upSort(arr1)//[14, 22, 23, 33, 34, 67]
upSort(arr2)//[11, 23, 43, 65]
​
//方法3   自定义方法实现
// 函数和方法的区别?
// 函数:是独立存在的函数 通过fn()调用
// 方法:是属于对象的函数,方法也是函数,是特殊的函数,通过dog.bark()调用
//括号左边是函数,‘.’的右边是方法
​
//先构造函数
Array.prototype.upSort2 = function(){var xx =[]//构造函数中的this指向了将来被创建的对象,即arr3,arr4
for(var i = 0; i <this.length; i++){//每个数字都要比较n-i次for(var j = 0; j < this.length - i ; j++){if(this[j] > this[j+1]){//升序//交换var temp;temp = this[j];this[j] = this[j+1];this[j+1] = temp}}
}
xx = this
return xx
}
var arr3 = [99,11,22,33]
var arr4 = [113,23,43]
console.log( arr3.upSort2() ); // [11, 22, 33, 99]
console.log( arr4.upSort2() )   //[23, 43, 113]
//封装一个函数,查找某一个元素是否存在数组中,如果存在就返回索引,如果不存在就返回-1。
// 方法1:封装函数
var arr = [32,12,45];
// console.log( arr.indexOf(11) );//-1
function search(arr,x){//遍历数组for(var i = 0; i < arr.length; i++){if(arr[i] === x){return i}}return  -1
​
}
// search(arr,32)
console.log( search(arr,45) );
​
//方法2:自定义方法
Array.prototype._indexOf = function(value){for(var i=0; i<this.length; i++){if(this[i] == value){return i;}}return -1;}
​var arr = [1,2,3,4];console.log(arr._indexOf(3));
    //4.程序可能会需要一个元素值相对唯一的数组,这样我们就需要将数组中重复的值剔除出去。新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 var arr = [3,4,2,3,3]var new_arr = []//遍历for(var i = 0; i < arr.length;i++){//新数组如果没有值和原数组的值相等,就将原数组的值放入新数组if( new_arr.indexOf(arr[i]) ){new_arr.push(arr[i])}}console.log(new_arr);//[3, 4, 2]

week2.2数组方法及封装——每天一个JS小总结相关推荐

  1. 自己封装的一个js方法用于获取显示的星期和日期时间

    自己封装的一个js方法用于获取显示的星期和日期时间 /*** 获取用于显示的星期和日期时间* @param date* @returns {string}*/ function getWeek(dat ...

  2. 自己封装的一个JS分享组件

    因为工作的需求之前也封装过一个JS分享插件,集成了我们公司常用的几个分享平台. 但是总感觉之前的结构上很不理想,样式,行为揉成一起,心里想的做的完美,实际上总是很多的偏差,所以这次我对其进行了改版. ...

  3. 【JavaScript】(一)解读一个js小游戏

    [前言] 离公司近的好处,就在于每天都能利用自己的下班时间,更好地查漏补缺,充实技能. 最近小编做的项目需要写js偏多,而我不擅长写前端js,利用工作之余,开始学习,下面通过一个成型的js小游戏,开始 ...

  4. 使用python封装了一个获取小程序token,发送订阅消息的类

    前言 这是在开发小程序过程中用到的一个类,这里放出来希望对大家有一些帮助. class WeAPP():def __new__(cls, *args, **kwargs):if not hasattr ...

  5. 每天一个js小demo --全选与反选

    如图所示 点击全选的时候是全选,点击全不选的时候是全不选,点击反选的时候是反选,这话说的感觉和说了话是的,哈哈哈哈 直接上 代码 <body><form action="& ...

  6. js map 排序_数组方法写给女友的一系列 JS 数组操作(建议收藏 | 内附思维导图)...

    前言 最近和女友,咳咳...(说出来可能会被打s)学习JS数组方法,用几个字形容的话就是听说过,实际使用.遇到的时候就分不清具体方法会得到怎样的结果. 今天我将通过这篇文章好好整理一下关于JS数组的方 ...

  7. 「数组方法」写给女友的一系列 JS 数组操作(建议收藏 | 内附思维导图)

    前言 最近和女友,咳咳-(说出来可能会被打s)学习JS数组方法,用几个字形容的话就是听说过,实际使用.遇到的时候就分不清具体方法会得到怎样的结果. 今天我将通过这篇文章好好整理一下关于JS数组的方法, ...

  8. 张鑫旭数组方法总结收录

    转载地址:https://www.zhangxinxu.com/wordpress/2013/04/es5%e6%96%b0%e5%a2%9e%e6%95%b0%e7%bb%84%e6%96%b9%e ...

  9. python大作业数独_python做一个数独小游戏

    最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...

最新文章

  1. GO库安装报错解决:unrecognized import path golang.org/x/net (https fetch: dial tcp i/o timeout
  2. 新一代HTML5开发工具Wijmo子控件详解
  3. 图的两种遍历算法——BFS和DFS
  4. SAP存货后续调整总结
  5. android实现自动抢红包,Android手机辅助功能实现自动抢微信红包功能
  6. 使用Spring Boot和GraphQL构建安全的API
  7. 关于某些人和某些事的断想
  8. 下面哪个字段是http请求中必须具备的_理解HTTP协议-HTTP协议详解总结
  9. nfc卡模式与标准模式_张家口市环卫进入首都标准“京环模式”
  10. 苹果收购英特尔手机芯片业务;西门子将在华建立 5G 研发中心;React Native 0.60.4 发布 | 极客头条...
  11. python变量及其作用域,闭包
  12. C语言和C++中如何编写交换两个整形变量值的函数
  13. 广电行业编码传输系统调研
  14. 软件测试技术课后习题:第1章软件测试概述-广东高等教育出版社,主编杨胜利
  15. 妖人柴:都移动互联网时代了,为什么还要建网站?
  16. 小说阅读大全(安卓)最后一个绿色版。
  17. 6000字长文,终于将数据中台架构体系讲明白了
  18. 如何评价吴军《浪潮之巅》?来自反面的声音
  19. 传统行业如何了解人工智能?
  20. 图像滤波器的分类与介绍

热门文章

  1. 慎用还原Wpa.dbl文件
  2. YOLOv5 5.0版本检测FPS
  3. 号角的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  4. SQL优化之常用优化工具
  5. 2d激光重定位系列(一)AMCL:算法源码参数 相关资源整合
  6. @Validated和@Valid校验参数、级联属性、List
  7. 深入了解 vue-cli
  8. BUGKU--web详解
  9. 2610_lab2 命令行与快捷键
  10. Cordova徽章插件