数组

一、冒泡排列

对数组attr = [1,8,6,4,5,3,7,2,9]进行由大到小排列,用冒泡排列的方法排列时,会对数组进行比较互换。如果前一个数字较大,这2个元素排列方式不变,如果后一个元素较大,则这2个元素互换位置。对比互换方式如下:

第一次  [8,6,4,5,3,7,2,9,1]

第二次  [8,6,4,5,3,7,9,2,1]

第三次  [8,6,5,4,7,9,3,2,1]

第四次  [8,6,5,7,9,4,3,2,1]

              第五次  [8,6,7,9,5,4,3,2,1]

              第六次  [8,7,9,6,5,4,3,2,1]

              第七次  [8,9,7,6,5,4,3,2,1]

              第八次  [9,8,7,6,5,4,3,2,1]

此数组的长度为9,元素进行了8次对比互换以后完成了数组由大到小的排列,排列的次数是attr.length-1。数组attr = [1,8,6,4,5,3,7,2,9]冒泡排列的代码如下:

var attr = [1,8,6,4,5,3,7,2,9];//要进行冒泡排列的数组
var zj = 0;//定义一个交换使用的中间变量
for(var i = 0;i<attr.length-1;i++)//控制比较的轮数
{for(var j = 0;j<attr.length-1-i;j++)//控制每轮比较的次数
    {if(attr[j]<attr[j+1])//如果下一个元素大于当前元素
        {zj = attr[j];//把attr[j]的值给zjattr[j] = attr[j+1];//把attr[j+1]的值给attr[j]attr[j+1] = zj;//把zj的值再给attr[j+1]
        }}
}
alert(attr[0]);//输出索引对应的元素的值,alert(attr[0]);输出的元素就是9。

但是上面的元素排列的代码存在一个缺点就是每次比较都会对所有的元素进行比较,而实际上不需要每次都比较所有的元素,比如第七次  [8,9,7,6,5,4,3,2,1],只需要比较前两个元素就可以了,后面的元素已经是由大到小排列了,就没有必要再比较了。由上面的数组比较互换方式上可以看出,第一次需要比较8次,第二次需要比较7此,直到第七次需要比较2次,第8次只需要比较1次。第i次比较的次数j正好是attr.length-1-i,所以上面代码只需要改变j的值,第i轮比较的次数为for(var j = 0;j<attr.length-1-i;j++)。这样就减少了很多的计算量。

对数组排列除了上面的冒泡排列法以外,还有一种如下:

attr.sort();
alert(attr[0]);

但是此种排列方法在JS中不可以用,因为这种方法只排列数字的第一位。在别的语言里可尝试使用。

二、在数组里面查找数据

查找用户给定的数的索引(出现在第几个位置)。如果没有,输出一个提示,如果有,输出该元素的索引。

var attr = [1,2,3,4,5,6,7,8,9];//数组
var v = 6;//要查找的值
var sy = -1;//先把索引定义成一个负数
for(var i =0;i<attr.length;i++)//控制查找的次数
{if(attr[i]==v)//条件判断
    {sy = i;//如果找到目标值,把i的值给sy
    }
}
if(sy == -1)// 如果没找到目标值
{alert("没有找到数据");//就输出“没有找到数据”
}
else//如果找到目标值
alert("该元素在数组里的索引为: "+sy);//输出该目标元素的索引值

这种查找数据的方法运算量比较大,要把数组里面的每个元素都拿出来比较,知道找到目标元素。有一种可以减少运算量的方法叫做二分法,也可以查找数据,运算量也大大减少,提高运算效率。

二分法的原理就是把所有的元素分成2半。比如attr = [1,2,3,4,5,6,7,8,9];这组数组,最小的索引是0,最大的索引是8。把最大和最小索引取个平均值,索引是4,分成的2组数组就是0-4和5-8。看中间的索引,对应的元素是5,而目标值是6>5,索引0-4的数组就不需要考虑了,值考虑索引为5-8的数组。再取索引为5-8的平均值为6(取整数),数组的索引又分成了5-6和7-8。索引6对应的元素是7,目标值是6<7,所以索引7-8的数组就不需要考虑了。以此类推逐步减小目标值的范围,找出目标值的索引。二分法具体的代码如下:

var attr = [1,2,3,4,5,6,7,8,9];//数组
var v = 6;//要查找的值
var minsy = 0;//最小索引
var maxsy = attr.length-1;//最大索引
var midsy;//中间索引
while(true)
{midsy = parseInt((minsy+maxsy)/2)// 计算中间索引,有可能出现小数,要把中间索引转成整数。{if(attr[midsy] == v)//比较中间值和用户给定的值
        {break;}if(midsy = minsy)//只剩2个值的情况下;例如只剩下7和8,求平均数以后是7,结果还是剩下7和8。
        {          if(attr[midsy]==v)//如果大的索引对应的元素和目标元素相等
            {midsy = midsy+1;//中间索引+1后输出索引  break;//终止循环
            }else//如果大的索引对应的元素和目标元素不相等
            {midsy = -1;//给中间索引赋值-1,意思就是数组里面没有目标元素。break;//终止循环
            }}if(attr[midsy]>v)//如果中间索引对应的值>给定值,目标值在索引小的那一半里面。
        {maxsy = midsy;//把中间索引值变成最大值
        }else//中间索引对应的值<给定值,目标值在索引大的那一半里面。
        {minsy == midsy;}}
}
alert(midsy);

转载于:https://www.cnblogs.com/xiaofox0018/p/5885850.html

9月19日下午JavaScript数组冒泡排列和二分法相关推荐

  1. 面试经历---网易(2016年01月19日下午面试)

    下面写上网易的面试情况. 1.nginx负载均衡的方式 (1).轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. (2).weight 指定轮询几率, ...

  2. 互联网晚报 | 3月19日 星期六 |​ 拼多多回应“六万人砍价不成功”;Netflix计划向分享账号的用户收费...

    拼多多回应"六万人砍价不成功":不实 未来将完善活动流程 新浪科技讯 3月19日下午消息,近日,主播直播间动员几万人参与拼多多砍一刀,称两小时内也没有成功.网友纷纷要官方给出一个回 ...

  3. 谷歌Pixel 6系列手机发布会官宣定档 10月19日发布

    昨日,谷歌正式宣布将于美国东部时间10月19日下午1点/太平洋时间上午10点/北京时间20日凌晨1点举行线上发布会,届时Pixel 6系列手机将正式亮相. 据谷歌推文介绍,Pixel 6系列手机包括P ...

  4. 国服和平精英服务器维护,和平精英辅助免费使用绝地求生12月19日正式服维护公告 今天维护要多久...

    绝地求生今天早上将对正式服进行停机维护,主要是更新PC1.0版本第24轮的内容,大部分内容之前在测试服已经上过一段时间,本次更新会有追加内容,一起来了解一下吧. [绝地求生最新维护公告] 1.维护开始 ...

  5. 2021年4月19日 深圳头条后台开发实习面试(二面)(含总结)

    title: 2021年4月19日 深圳头条后台开发实习面试(二面) tags: 面经 2021年4月19日 深圳头条后台开发实习面试(二面) 自我介绍 面试直接跟我讲你想让我问哪个方面的问题呢?(这 ...

  6. 2021年3月19日 百度开发实习面试(质量效能研发部)(一面)

    title: 2021年3月19日 百度开发实习面试(质量效能研发部)(一面) tags: 面经 2021年3月19日 百度开发实习面试(质量效能研发部)(一面) 自我介绍介绍项目你介绍一下hashm ...

  7. 2018年08月19日发烧诸事记

    2018年08月19日发烧诸事记 关于发烧给敲响的警钟 八月十六日,中午突然觉的有发烧症状,会宿舍喝了些水便回去了,下午上课时情况愈加严重,浑身发冷,无法正常训练,三点多时便去永康街上的社区医疗服务中 ...

  8. 分享Silverlight/WPF/Windows Phone一周学习导读(8月15日-8月19日)

    分享Silverlight/WPF/Windows Phone一周学习导读(8月15日-8月19日) 本周Silverlight学习资源更新: Silverlight Tools 4安装时的错误提示 ...

  9. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月13日-8月19日)

    Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月13日-8月19日) 本周Silverlight学习资源更新 Silverlight中如何实现上下标的显示 Lice ...

最新文章

  1. 四月青少年编程组队学习(图形化四级)Task05
  2. 查看哪个进程占用端口
  3. C++基础回顾-强制类型转换
  4. 搞硬件,别吹牛了,好好做个规划!
  5. leetcode 9 --- 回文数
  6. 解决 webpack-dev-server 不能自动刷新的问题
  7. 打破超星封锁——PDG转PDF方法
  8. java自动机字符串匹配_【算法】利用有限自动机进行字符串匹配
  9. CF1313C2 Skyscrapers (hard version) -单调栈优化dp
  10. unix网络编程中的fd是什么
  11. GIS——地图比例尺
  12. 使用Encoder-Decoder模型自动生成对联的思路
  13. 蓝牙鼠标卡顿,蓝牙与wifi冲突解决方式
  14. NOJ1635看望朋友
  15. 私服上传出现Failed to transfer file ...... 400错误
  16. 规则在自然语言处理领域的重要地位
  17. FFmpeg中的时间基(time_base), AV_TIME_BASE
  18. [NCTF2019]SQLi 1regexp注入
  19. 阴天(唐伯虎点秋香版)2铃声 阴天(唐伯虎点秋香版)2手机铃声免...
  20. 必须掌握的八个dos命令

热门文章

  1. 01背包java 源码
  2. “斐波那契数列”的两种算法
  3. 捉虫记---查看变量,整数转浮点
  4. 腾讯面试:比特位计数
  5. linux下zip2
  6. extern“C”有什么作用
  7. Arduino产生PWM的3种方法
  8. 在定义常量时,为什么推荐使用const,而不是#define?
  9. 简述进程的启动、终止的方式以及如何进行进程的查看。
  10. Keil μVision 5版新建工程详细步骤(版本2)