数组

一、冒泡排列

对数组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]冒泡排列的代码如下:

  1. var attr = [1,8,6,4,5,3,7,2,9];//要进行冒泡排列的数组
  2. var zj = 0;//定义一个交换使用的中间变量
  3. for(var i = 0;i<attr.length-1;i++)//控制比较的轮数
  4. {
  5. for(var j = 0;j<attr.length-1-i;j++)//控制每轮比较的次数
  6. {
  7. if(attr[j]<attr[j+1])//如果下一个元素大于当前元素
  8. {
  9. zj = attr[j];//把attr[j]的值给zj
  10. attr[j] = attr[j+1];//把attr[j+1]的值给attr[j]
  11. attr[j+1] = zj;//把zj的值再给attr[j+1]
  12. }
  13. }
  14. }
  15. 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++)。这样就减少了很多的计算量。

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

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

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

二、在数组里面查找数据

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

  1. var attr = [1,2,3,4,5,6,7,8,9];//数组
  2. var v = 6;//要查找的值
  3. var sy = -1;//先把索引定义成一个负数
  4. for(var i =0;i<attr.length;i++)//控制查找的次数
  5. {
  6. if(attr[i]==v)//条件判断
  7. {
  8. sy = i;//如果找到目标值,把i的值给sy
  9. }
  10. }
  11. if(sy == -1)// 如果没找到目标值
  12. {
  13. alert("没有找到数据");//就输出“没有找到数据”
  14. }
  15. 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的数组就不需要考虑了。以此类推逐步减小目标值的范围,找出目标值的索引。二分法具体的代码如下:

  1. var attr = [1,2,3,4,5,6,7,8,9];//数组
  2. var v = 6;//要查找的值
  3. var minsy = 0;//最小索引
  4. var maxsy = attr.length-1;//最大索引
  5. var midsy;//中间索引
  6. while(true)
  7. {
  8. midsy = parseInt((minsy+maxsy)/2)// 计算中间索引,有可能出现小数,要把中间索引转成整数。
  9. {
  10. if(attr[midsy] == v)//比较中间值和用户给定的值
  11. {
  12. break;
  13. }
  14. if(midsy = minsy)//只剩2个值的情况下;例如只剩下7和8,求平均数以后是7,结果还是剩下7和8。
  15. {
  16. ifattr[midsy]==v//如果大的索引对应的元素和目标元素相等
  17. {
  18. midsy = midsy+1;//中间索引+1后输出索引
  19. break;//终止循环
  20. }
  21. else//如果大的索引对应的元素和目标元素不相等
  22. {
  23. midsy = -1;//给中间索引赋值-1,意思就是数组里面没有目标元素。
  24. break;//终止循环
  25. }
  26. }
  27. if(attr[midsy]>v)//如果中间索引对应的值>给定值,目标值在索引小的那一半里面。
  28. {
  29. maxsy = midsy;//把中间索引值变成最大值
  30. }
  31. else//中间索引对应的值<给定值,目标值在索引大的那一半里面。
  32. {
  33. minsy == midsy;
  34. }
  35. }
  36. }
  37. alert(midsy);

JS数组2(冒泡排列、数组里面查找数据)的更多相关文章

  1. java基础5 (一维)数组和二维数组

    本文知识点(目录): 一维数组(一维数组的概念.优点.格式.定义.初始化.遍历.常见异常.内存分析以及常见操作(找最大值.选择排序.冒泡排序等等))    二维数组(二维数组的遍历.排序.查找.定义. ...

  2. 9月19日下午JavaScript数组冒泡排列和二分法

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

  3. 手写面试编程题- 数组去重 深拷贝 获取文本节点 设置奇数偶数背景色 JS中检测变量为string类型的方法 第6题闭包 将两个数组合并为一个数组 怎样添加、移除、移动、复制、创建和查找节点? 继承 对一个数组实现随机排序 让元素水平 垂直居中的三种方式 通过jQuery的extend方法实现深拷贝

    第1题==>实现数组去重 通过 new Set(数组名) // var arr = [12, 12, 3, 4, 5, 4, 5, 6, 6]; // var newarr1 = new Set ...

  4. js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合

    现在有一批手机,其中颜色有['白色','黑色','金色','粉红色']:内存大小有['16G','32G','64G','128G'],版本有['移动','联通','电信'],要求写一个算法,实现[[ ...

  5. js上 十六、数组-2

    十六.数组-2 #4.3万能法:splice(): #4.3.1.删除功能 ​ 语法:arr.splice(index,num); //num表示删除的长度 ​ 功能:从下标index位置开始,删除n ...

  6. js数组的操作及数组与字符串的相互转化

    数组与字符串的相互转化 <script type="text/javascript">var obj="new1abcdefg".replace(/ ...

  7. js删除数组元素、清空数组的简单方法

    一.清空数组 ? 1 2 3 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即 ...

  8. JS如何去掉一个数组的重复元素 (数组去重)

    一.思路如下: 定义一个新数组,将老数组遍历一遍,再进行判断,如果新数组里面没有老数组的元素就添加,否则就不添加,最终输出整个新数组. 二.代码如下: var arr = ["a" ...

  9. js基础总结03 --操作数组

    修改于 2019-11-10 1 length:长度 <script> var arr = [1,2,3,4,5,6,7,8]; console.log(arr.length);//arr ...

随机推荐

  1. mysql 截取字符

    $where="(left(`type_id`,1)=1"; 返回 type_id 字段 从左边开始长度为1个字符 LEFT(str,len)返回字符串str的最左面len个字符. ...

  2. C++ 里 构建动态二维数组

    //****动态二维数组 /* int m=3; int **data; int n=2; data=new int*[m]; for(int j=0;j<m;j++) { data[j]=ne ...

  3. Nginx安装第二步手动下载依赖包

    nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译环 ...

  4. sql server查询数据库中所有表的行数

    select a.name,b.rows from sysobjects a,sysindexes b where a.name = b.name order by b.rows desc

  5. 批量kill进程

    ps -e | grep java |awk '{print $1}'|xargs kill -9

  6. 在Ubuntu下设置环境变量

    在Ubuntu中有如下几个文件可以设置环境变量 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. /e ...

  7. 利用HttpModule开发asp.net页面、ashx等访问时session失效的统一处理入口

    web程序时,当使用session时总会出现失效而报“未将对象引用设置到对象的实例”的http 500错误,本人比较懒,不想每个地方都用try catch处理,就找到个用httpModule统一处理的 ...

  8. Linux下使用Magent+Memcached缓存服务器集群部署

    1.编译安装libevent  cd /root/soft_hhf/  wget http://cloud.github.com/downloads/libevent/libevent/libeven ...

  9. Win7下的本地网站发布

    今天闲来无事研究了一下网站的发布,之前一直以为很难的样子,当真正实现了就觉得他也不过如此,现在来把我的研究结果分享一下,如果有问题望大家提出来! 首先发布网站我们要在本地的电脑上安装IIS,这个就不多 ...

  10. 新手学Android

    Eclipse平台下的新手Android学习记录. 1.打开一个本地的项目 在Project Explorer右键->Import->Existing Projects into Work ...