数组

一、冒泡排列

对数组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. 配置163Yum源自动判断你的系统是Centos版本(适用于5.x或6.x)

    #!/bin/bash #Author:nulige #Date: 2015-3-8 #实现功能:自动判断你的系统是Centos版本,适用于5.x或6.x mv /etc/yum.repos.d/Ce ...

  2. python+urllib+beautifulSoup实现一个简单的爬虫

    urllib是python3.x中提供的一系列操作的URL的库,它可以轻松的模拟用户使用浏览器访问网页. Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能 ...

  3. bootstrap-model-弹出框背景禁止点击

    bootstrap的model弹出框,默认在点击背景时会隐藏,而有时特殊效果是不允许隐藏,下面就是解决方案:本例参考来自这里 方法一: $('#myModal').modal({backdrop: ' ...

  4. JS-slider.js实现鼠标拖动滑块控制取值特效

    制作效果,如下图,鼠标点击颜色标能左右拖动并设置文本框中的值 源码: <div id="example"> <div id="slideContaine ...

  5. ThreadLocal原理与模拟

    首先用一个程序模拟一下ThreadLocal: public class ThreadLocal1 { private static Dictionary<Thread, Integer> ...

  6. 【BZOJ-1076】奖励关 概率与期望 + 状态压缩DP

    1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1602  Solved: 891[Submit][Status ...

  7. FT232RL变砖之后

    FT232RL是个是神奇的片子,说万能可能有些夸张,但是...总之就是FTDIChip这个神奇的公司基于类似的技术,做了很多好用的产品,包括转IIC啦,转SPI啦,密码狗啦之类的.是个很有用的工具就对 ...

  8. iOS Keychain钥匙串,应用间数据共享打造iOS上的全家桶

    Demo先行:https://github.com/rayshen/GIKeychainGroupDemo 该demo里有2个工程,你先运行任何一个会存储一个值,再运行另一个会访问之前的app存储的值 ...

  9. ExceptionLess异常日志收集框架-1

    哈哈,中秋和代码更配哦,不知不觉一年过半了,祝园友们中秋快乐 前一阵子在博客园看到了一篇博文 http://www.cnblogs.com/savorboard/p/exceptionless.htm ...

  10. SQLite遇到的关于x64、x86问题

    初次使用SQLite遇到了莫名其妙的问题: 未能加载文件或程序集“System.Data.SQLite, Version=1.0.92.0, Culture=neutral, PublicKeyTok ...