数组的应用
(1)查找
其实在数组的属性与方法中,我们学习了一个indexOf方法就是查找,它是系统提供的方法,我们其实也可以实现自己的查找方法。
a、顺序查找
<script>
var a = [3,1,34,45,35,67,84,36,24];
var num = Number(prompt("请输入要查找的值:"));
var index = -1;//最初认为要找的数不在数组中
for(var i in a){
if(a[i] == num){
index = i;
break;
}
}
alert(index);
</script>
这种查找方式最简单,但是查找次数与数据量成正比,效率不高。
b、折半查找(二分查找)
假设在一个有序的数组中,可以利用折半查找,大幅度提高效率
/*折半查找
* 思路:
* (1)用start表示查找范围的起点,end表示终点
* (2)只要start<=end就重复以下步骤
* (3)和中间位置(mid)的那个数进行比较
* a、相等:找到了,结束
* b、大于:在前半段找,即end=mid-1
* c、小于:在后半段找,级start=mid+1
* (4)输出查找结果
* */
var a = [1,3,24,34,35,36,45,67,84,];
var num = Number(prompt("请输入要查找的值:"));
var index = -1;//最初认为要找的数不在数组中
var start = 0;
var end = a.length-1;
while(start <= end){
var mid = Math.ceil((start+end)/2);//计算中间位置
if(num == a[mid]){
index = mid;//把找到的位置记下来
break;
}else{
if(num > a[mid]){
//在后半段找
start = mid + 1;
}else{
//在前半段找
end = mid - 1;
}
}
}
alert(index);
折半查找的最坏查找次数与数据量的关系是对数关系,所以说它的查找效率很高,但是任何事物往往都有两面性,它是高效率
也是有高代价的,也就是要求数组必须有序。
(2)排序(冒泡排序)
var a = [3,1,34,45,35,67,84,36,24,46];
for (var i=0; i<=a.length-1; i++) {
for (var j=0; j<a.length-i-1; j++) {
//不满足升序就对调
if (a[j] > a[j+1]) {
var t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
alert(a.toString());
(3)队列
先进先出(FIFO),在头部出队(shift),在尾部入队(push)
var a = [];
a.push(1);
document.write(a.toString() + "<br>");
a.push(2);
document.write(a.toString() + "<br>");
a.push(3);
document.write(a.toString() + "<br>");
a.shift();
document.write(a.toString() + "<br>");
a.shift();
document.write(a.toString() + "<br>");
a.shift();
document.write(a.toString() + "<br>");
(4)堆栈
先进后出(FILO),在尾部进栈(push),在尾部出栈(pop)
var a = [];
a.push(1);
document.write(a.toString() + "<br>");
a.push(2);
document.write(a.toString() + "<br>");
a.push(3);
document.write(a.toString() + "<br>");
a.pop();
document.write(a.toString() + "<br>");
a.pop();
document.write(a.toString() + "<br>");
a.pop();
document.write(a.toString() + "<br>");
今天这篇是为了补充上次写的JS的数组内容,都是使用案例来说明这些知识。