有序数组二分查找法比较次数
数据量 所需比较的次数
10 4
100 7
1000 10
10000 14
100000 17
1000000 20
10000000 24
100000000 27
1000000000 30
有序数组优点:查找速度比无序数组快多了
缺点:插入时要按排序方式把后面的数据进行移动
有序数组和无序数组共同的缺点:删除数据项时必须把后面的数据向前移动来填补删 除项的洞
java代码实现
有序数组类
package sortedListApp;
public class OrdArray {
private long [] a;
private int nElems;
//构造函数
public OrdArray(int max){
a=new long[max];
nElems=0;
}
public int size(){//查看大小,元素个数
return nElems;
}
//二分查找
public int find (long searchKey){
int lowerBound=0;//开始的位置
int upperBound=nElems-1;//最后的位置
int curIn;
while(true){
curIn=(lowerBound+upperBound)/2;
if(a[curIn]==searchKey)
return curIn;
else if(lowerBound>upperBound)//没有找到
return nElems;
else{//还要继续查找
if(a[curIn]<searchKey)//往后查
lowerBound=curIn+1;
else//往前查
upperBound=curIn-1;
}
}
}
//删除数据
public boolean delete(long value){
int j=find(value);
if(j==nElems){
return false;
}else{
for(int k=j;k<nElems;k++)
a[k]=a[k+1];
nElems--;
return true;
}
}
//添加数据
public void insert(long value){
int j;
for (j=0;j<nElems;j++)
if(a[j]>value)break;
for(int k=nElems;k>j;k--)//那后面的数据项往后移动
a[k]=a[k-1];
a[j]=value;
nElems++;//每添加一个数据项,数据总量都要加一
}
//显示所有数据
public void dispaly(){
for (int j=0;j<nElems;j++){
System.out.print(a[j]+" ");
}
System.out.println();
}
}
测试类
package sortedListApp;
public class test {
/**
* @param args
*/
public static void main(String[] args) {
int maxSize=100;
OrdArray arr;
arr=new OrdArray(maxSize);
arr.insert(77);
arr.insert(55);
arr.insert(44);
arr.insert(99);
arr.insert(88);
arr.insert(11);
arr.insert(00);
arr.insert(66);
arr.insert(33);
int searchKey=55;
if(arr.find(searchKey)!=arr.size())
System.out.println("find"+searchKey);
else
System.out.println(" cannot find"+searchKey);
arr.dispaly();
arr.delete(00);
arr.delete(55);
arr.delete(88);
arr.dispaly();
}
}