数据结构与算法--有序数组和二分法查找

package youxu;


/**
 * 有序数组
 */
public class YouXu {
private long[] a;
private int size;

public YouXu(int size){
a = new long[size];
size = 0;
}
public int size(){
return size;
}

//生成有序数组  添加数据
public void insert(long value){
int j;
//判断数组a中比传入的值大的位置
for(j=0;j<size;j++){
if(a[j]>value)
break;
}
//移动后续的数组值
for(int k=size;k>j;k--){
//从数组索引的最后一个一个的查找到j的位置
a[k] = a[k-1];
}
a[j] = value; //设置当前数据
size++;  //容量加1
}
//二分查找
public int find(int value){
int lowerIndex = 0;   //记录最小索引
int maxIndex = size-1;    //记录最大索引
int currentIndex;   //记录当前索引
while(true){
currentIndex = (lowerIndex + maxIndex) / 2;
if(a[currentIndex]==value){  //正好在中间  直接返回
return currentIndex;
}else if(lowerIndex>maxIndex){  //最小索引大于最大索引  没有找到
return size;   //返回最大容量
}else{
if(a[currentIndex]<value){   //  中间值小
lowerIndex = currentIndex+1;  //将最小索引设置为中间索引+1
}else if(a[currentIndex]>value){  //中间值大
maxIndex = currentIndex-1;   //将最大索引设置为中间索引-1
}
}
}
}

//删除数据项
public boolean delete(int value){
int j = find(value);   //通过二分查找
if(j==size){   //没有找到
return false;
}else{
for(int i=j;i<size;i++){   // 找到了,将后一位索引上的数据向前移动一位 
a[i] = a[i+1];
}
size--;  //容量减1
return true;
}
}

//展示数组数据
public void show(){
for(int i=0;i<size;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}

public static void main(String[] args) {
//初始化
YouXu xu = new YouXu(100);
System.out.println(xu.size());
xu.insert(12);
xu.insert(32);
xu.insert(1);
xu.insert(54);
xu.insert(66);
xu.insert(99);
xu.insert(54);
xu.insert(6);
xu.insert(109);
xu.insert(9);
System.out.println(xu.size());
//打印有序数组
xu.show();
//二分法查找
System.out.println("99的索引:"+xu.find(99));
System.out.println("100的索引:"+xu.find(100));
//删除
System.out.println(xu.delete(99));
System.out.println(xu.delete(100));

}



}

猜你喜欢

转载自blog.csdn.net/zxz9325/article/details/79633139