向数组添加新元素时去重复
1.一般的思路与原理
var a =[3,5,8,9,2,10,4] ;//原始数组 var x =4 ;//新数据 var cf = false ;//设定一个判断是否重复的值 for(var i=0;i<a.length;i++)//循环遍历 { if(a[i]==x)//数据重复 { cf=true;//改变设定变量的值 } } if(cf==true)//数据重复执行的代码 { alert("该数据已存在"); } else//数据没有重复 { a.push(x);//添加到数组中 }
2.更简便的方法,indexOf( ) 可以返回相应数据在对应数组中的索引号,如果数组中没有改数据,则会返回-1,
所以可以用 indexOf( ) 来判断数据是否重复,
var a =[3,5,8,9,2,10,4] ;//原始数组 var x =4 ;//新数据 var b = a.indexOf(x);//定义变量b来接收indexOf()的返回值 if(b==-1)//返回值为-1,数组中没有该数据 { a.push(x);//把数据添加到数组中 } else//返回值不为-1就说明数组中有该数据 { alert("该数据已存在");//数据重复执行的代码 }
冒泡排序
将一个无序的无重复数组按照从大到小或从小到大的顺序重新排列,这里按照从大到小的顺序分析,原理是依次比较每两个数据的大小,把小的值往后放,即如果前一个数据小于后一个数据,则交换,如果前一个数据大于后一个数据,则不变
首先定义一个原始数组
var attr = [4,7,3,6,8,1,2,9,5];//原始数组
第一个数据和第二个数据的比较和交换
var i = 0 ;//索引为0 var a = attr[i]<attr[i+1];//比较第一个和第二个数据 if(a==true)//如果第一个数据小于第二个数据 { //交换 var b = attr[i];//设定一个中间变量b用来接收第一个数据的值 attr[i] = attr[i+1];//第一个数据变为较大值 attr[i+1] = b;//第二个数据变为较小值 }
如果要比较到底就要用for循环
for(var i=0;i<attr.length-1;i++)//两两比较的次数为数组的长度减一 { if(attr[i]<attr[i+1])//如果前一个数据小于后一个数据 { //交换 var b = attr[i];//设定一个中间变量b用来接收第一个数据的值 attr[i] = attr[i+1];//第一个数据变为较大值 attr[i+1] = b;//第二个数据变为较小值 } //如果前一数据大于后一数据则无变化 }
输出数组发现最小值排到了最下面,按照这样最多继续8个轮次就可以把数据从大到小排列完毕,所以可以在外层套用一个循环来控制比较的轮次,而且轮次越往后,每轮的两两比较次数会越少,因为最小的值已经依次排好了,排好的数据个数(x)正好是轮次数(j)减一,两两比较的次数(z)是未排好的数据个数(y)减一,并且数据的总个数是length,所以 x+y=length;x=j-1;z=y-1 ==>y=z+1;==> (j-1)+(z+1)=length;==> z=length-j ,最终可以写为:
for(var j=1;j<attr.length;j++)//控制比较的轮次,从1开始所以有attr.length-1轮 { for(var i=0;i<attr.length-j;i++)//两两比较的次数为数组的长度减轮次 { if(attr[i]<attr[i+1])//如果前一个数据小于后一个数据 { //交换 var b = attr[i];//设定一个中间变量b用来接收第一个数据的值 attr[i] = attr[i+1];//第一个数据变为较大值 attr[i+1] = b;//第二个数据变为较小值 } //如果前一数据大于后一数据则无变化 } }
输出为
如果想从小到大排序,只要把条件改为当前一数据大于后一数据时交换就可以了,即把 if 中的小于号改为大于号。
数据排序的简便方法
sort( )方法,默认按数据首位数字的值升序排序,可以加一个排序函数来达到按数值升序排序
function sortNumber(a,b) { return a-b } attr.sort(sortNumber);
二分法查找数据
二分法适用于有序排列的数组,原理是索引取中进行判断,逐步二分舍弃缩小比较范围,最终找到数据的索引值,优点是比较次数少,在大数据查找时可以节省计算机资源
var attr =[1,2,3,4,5,6,7,8,9,10];//原始数组 var sr =11;//需要查找的数据 var minxl =0;//最小索引 var maxxl =attr.length-1;//最大索引 var midxl =0;//取中索引 while(true) { //索引取中 midxl=parseInt((minxl+maxxl)/2) //判断是否是需要找的索引号 if(attr[midxl]==sr) { break;//是,找到并退出循环 } //判断是否只剩两个值 if(minxl==midxl) { //判断最末索引是否是需要的索引号 if(attr[midxl+1]==sr) { //是,找到并退出循环 midxl=midxl+1 break; } else { //不是,没有合适的值,退出循环 midxl=-1;//赋予一个不可能是索引的值 break; } } //更改检索的范围,即二分 if(attr[midxl]<sr) { minxl=midxl; } else { maxxl=midxl; } } if(midxl==-1) { alert("没有该数据"); } else { alert("该数据序列号为"+midxl); }
时间: 2024-10-05 20:31:08