数组

一、冒泡排列

对数组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]的值给zj
attr[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);

9月19日下午JavaScript数组冒泡排列和二分法的更多相关文章

  1. 9月19日上午JavaScript数组

    数组 一.定义 1.数组的文字定义 广义上说,数组是相同类型数据的集合.但是对于强类型语言和弱类型语言来说其特点是不一样的.强类型语言数组和集合有以下特点. 数组强类型语言:1.数组里面只能存放相同数 ...

  2. 9月20日下午JavaScript函数--递归

    例题1:公园里有200个桃子,猴子每天吃掉一半以后扔掉一个,问6天以后还剩余多少桃子? var sum = 200; for(var i= 0;i<6;i++) { sum = parseInt ...

  3. Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档

    array,list,dataframe索引切片操作 2016年07月19日——智浪文档 list,一维,二维array,datafrme,loc.iloc.ix的简单探讨 Numpy数组的索引和切片 ...

  4. Python 学习日志9月19日

    9月19日 周二 今天是普通的一天,昨天也是普通的一天,刚才我差点忘记写日志,突然想起来有个事情没做,回来写. 今天早晨学习<Head First HTML and CSS>第十一章节“布 ...

  5. 2016年12月19日 星期一 --出埃及记 Exodus 21:14

    2016年12月19日 星期一 --出埃及记 Exodus 21:14 But if a man schemes and kills another man deliberately, take hi ...

  6. 2016年11月19日 星期六 --出埃及记 Exodus 20:10

    2016年11月19日 星期六 --出埃及记 Exodus 20:10 but the seventh day is a Sabbath to the LORD your God. On it you ...

  7. 2016年10月19日 星期三 --出埃及记 Exodus 19:3

    2016年10月19日 星期三 --出埃及记 Exodus 19:3 Then Moses went up to God, and the LORD called to him from the mo ...

  8. 7月19日Docker&Kubernetes技术沙龙总结 - DockOne.io

    7月19日Docker&Kubernetes技术沙龙总结 - DockOne.io undefined

  9. 成都Uber优步司机奖励政策(4月19日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

随机推荐

  1. directly receive json data from javascript in mvc

    if you send json data to mvc,how can you receive them and parse them more simply? you can do it like ...

  2. JNI系列——C文件中的方法调用Java中方法

    1.创建xxx.jni包并在该包下实现一些Java的方法,和要调用的本地方法 2.实现MainActivity中的按钮点击事件-即点击按钮调用本地的方法 3.在C文件中的方法中回调Java的方法 3. ...

  3. cygwin-使用介绍

    cygwin使用: 使用上的方便性很是不错,启动Cygwin以后,会在Windows下得到一个Bash Shell,由于Cygwin是以Windows下的服务运行的,所以很多情况下和在Linux下有很 ...

  4. 使用IDEA和gradle搭建Spring MVC和MyBatis开发环境

    1. 概述 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐 ...

  5. 【USACO 1.3】Ski Course Design

    n个点(n<=1000)大小范围[0,100],改变一些点的值,使得极差不超过17,代价为改变值的平方. 枚举修改后的最低高度low,维护最小代价. /* TASK: skidesign LAN ...

  6. 终端可以连接MySQL但是navicat还是报错:Can't connect to MySQL server on '127.0.0.1'(61)

    1)选择第二个: 2)勾选 Use socket file就行了

  7. 单例模式:Instance

    前言: 学习面向对象程序设计的朋友应该知道,我们大多数情况下通过 new 操作来实例化对象的.对于一些仅需要一次初始化的对象来说,频繁的new操作无疑会过多浪费内存空间.基于此,单例模式便应运而生了. ...

  8. [学习笔记]tarjan求割边

    上午打模拟赛的时候想出了第三题题解,可是我不会求割边只能暴力判割边了QAQ 所以,本文介绍求割边(又称桥). 的定义同求有向图强连通分量. 枚举当前点的所有邻接点: 1.如果某个邻接点未被访问过,则访 ...

  9. 【BZOJ-1103】大都市meg 树状数组 + DFS序

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2009  Solved: 1056[Submit][Sta ...

  10. 【BZOJ-1026】windy数 数位DP

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5230  Solved: 2353[Submit][Sta ...