之前学校开了数据结构这门课,是C语言版的,没认真学,只好现在来补一补了
首先要说的是必须是有序的,不然是没办法用二分法查找的
1.有序数组优缺点
优点:查找速度(采用二分查找法)比无序数组快很多(查找的数据量越大,优势越明显)
下面是一组用二分法查找的数据:
数据量 所需比较次数
10 4
100 7
1000 10
10000 14
100000 17
1000000 20
10000000 24
100000000 27
缺点:插入时需要将后面的元素进行移动
2.然后下面是我实现有序数组二分查找的代码:
package ordarray; /** * 有序数组 * @author zhang * */ public class OrdArray { private long[] a; private int nElems; public OrdArray(int max){ a= new long[max]; nElems=0; } //二分查找方法 public int find(long serachKey){ int lowerBound=0; int upperBound=nElems-1; int curIn; while(true){ curIn=(lowerBound+upperBound)/2; if(a[curIn]==serachKey){ return curIn; }else if(lowerBound>upperBound){ return nElems; }else{ if(a[curIn]<serachKey){//往后查 lowerBound=curIn+1;//改变最小索引 }else{//往前查 upperBound=curIn-1;//改变最大索引 } } } } //二分法删除 public boolean delete2(long value){ int i=find(value); if(i==nElems){ return false; }else{ for(int j=i;j<nElems;j++){ a[j]=a[j+1]; } nElems--; return true; } } public int size(){//查看大小,元素个数 return nElems; } //添加数据(线性查找添加)插入一定是可以插入的,不像删除要查看要删除的元素是否存在 //从小到大排序插入 public void insert(long value){ int i; for(i=0;i<nElems;i++){ if(a[i]>value){ break; } } //j>i每次判断j是否大于我们停止的i位置 for(int j=nElems;j>i;j--){ //必须从最后一个开始移 a[j]=a[j-1]; } //最后插入我们要插入的元素 a[i]=value; nElems++; } //删除 public boolean delete(long value){ int i; for(i=0;i<nElems;i++){ if(a[i]==value){ break; } } if(i==nElems){ System.out.println("删除失败,没有"+value+"这个值"); return false; }else{ for(int j=i;j<nElems;j++){ a[j]=a[j+1]; } nElems--; return true; } } public void display(){ for(int i=0;i<nElems;i++){ System.out.print(a[i]+" "); } System.out.println(); } }
package ordarray; public class OrderedApp { public static void main(String[] args) { int maxSize=100; OrdArray arr; arr=new OrdArray(maxSize); arr.insert(77); arr.insert(66); arr.insert(76); arr.insert(79); arr.insert(44); arr.insert(55); arr.insert(34); arr.insert(23); arr.insert(66); arr.insert(97); int serachKey=76; if(arr.find(serachKey)!=arr.size()){ System.out.println("找到了"+serachKey); }else{ System.out.println("没有找到"+serachKey); } arr.display(); arr.delete2(23); arr.delete2(66); arr.display(); } }