一、首先创建有序数组的class,并且提供插入、二分查找功能。
import android.util.Log;
/**
* Created by Xi
* 有序数组二分查找
*/
public class ArrayOrderBinary {
private long[] orderArray;//有序数组
private int nElems;//数组里元素数量,没插入一个才会增加
public ArrayOrderBinary(int max){
orderArray=new long[max];
nElems=0;
}
/**
* 数组中元素数量
* @return
*/
public int size(){
return nElems;
}
/**
* 查找指定元素的位置
* @return
*/
public int find(long searchKey){
int lowerBound=0;
int upperBound=nElems-1;
int curIn;
while(true){
curIn=(lowerBound+upperBound)/2;
if(orderArray[curIn]==searchKey)//找到了,正是curIn
return curIn;
else if(lowerBound>upperBound)///没找到
return nElems;//返回大于最大索引整数
else{
if(orderArray[curIn]<searchKey)//往后查找
lowerBound=curIn+1;
else//往前查找
upperBound=curIn-1;
}
}
}
/**
* 插入元素
*/
public void insert(long value){
int inseartLoc;//别插入的位置
for(inseartLoc=0;inseartLoc<nElems;inseartLoc++)
if(orderArray[inseartLoc]>value)break;//若当前数组元素大于被插入元素,则继续往后移动,寻找位置,直到找到位置
for(int k=nElems;k>inseartLoc;k--){//将inseartLoc后面的元素都往后移动一位
orderArray[k]=orderArray[k-1];
}
orderArray[inseartLoc]=value;
nElems++;
}
/**
* 展示有序数组
*/
public void display(){
StringBuilder sb=new StringBuilder();
sb.append("[");
for(int i=0;i<nElems;i++){
if(i==nElems-1)
sb.append(orderArray[i]);
else {
sb.append(orderArray[i]);
sb.append(",");
}
}
sb.append("]");
Log.v("ArrayOrderBinary",sb.toString());
}
}
二、在主类中调用二分查找功能
/**
* 有序数组二分查找
*/
private void orderarryBinarySearch(){
ArrayOrderBinary orderArray=new ArrayOrderBinary(20);
orderArray.insert(12);
orderArray.insert(55);
orderArray.insert(2);
orderArray.insert(3);
orderArray.insert(5);
orderArray.insert(88);
orderArray.insert(13);
orderArray.display();
int searchKey=55;
if(orderArray.find(searchKey)!=orderArray.size())//找到
Log.v(TAG,"Found "+searchKey);
else
Log.v(TAG,"Can't find"+searchKey);
}
打印日志如下:
源码下载地址:点击打开链接