import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Arrays;
/**
* Class BinarySearch
* Description find()二分查找,delete() insert(),先通过二分查找到关键字,
* 求出下标对应的位置,然后删除和插入一个新的数。
* Company opendata
* Author Chenlly
* Date 08-11-25
* Vesion 1.0
*/
public class BinarySearch{
private int low;
private int height;
private int mid;
private int[] intArray;
//readDate()方法从键盘读取数据
public String readDate(){
InputStreamReader ir=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(ir);
String str="";
try{
str=br.readLine();
}catch(IOException ex){
ex.printStackTrace();
}
return str;
}
//initArray()方法初始化数组,并返回组中最后一个由用户输入数据的下标
public int initArray(){
int index=0;
intArray=new int[100];
for(int i=0;i<intArray.length;i++){
String str=new BinarySearch().readDate();
if("end".equals(str)){
break;
}else{
int num=Integer.parseInt(str);
intArray[i]=num;
}
index=i;
}
return index;
}
//find()方法对有序的数组进行二分查找
public int find(int keyWord,int index){
height=index;
while(true){
mid=(low+height)/2;
if(intArray[mid]==keyWord){
return mid;//找到这个元素
}else if(low>height){
return -1;//查找不到
}else{
if(intArray[mid]<keyWord){
low=mid+1;
}else{
if(intArray[mid]>keyWord){
height=mid-1;
}
}
}
}
}
//delete()方法删除数据
public int delete(int keyWordIndex,int index){
int temp=intArray[keyWordIndex];
for(int i=keyWordIndex;i<=index;i++){
intArray[i]=intArray[i+1];
}
return temp;
}
//insert()方法在通过二分查找找到的元素位置插入一新数据
public void insert(int keyWordIndex,int index,int newWord){
for(int i=index;i>=keyWordIndex;i--){
intArray[i+1]=intArray[i];
}
intArray[keyWordIndex]=newWord;
}
//display()方法显示数组中的数据
public void display(int index){
for(int i=0;i<index;i++){
System.out.println(intArray[i]);
}
}
//主函数
public static void main(String []args){
System.out.println("初始化数组");
BinarySearch bs=new BinarySearch();
int index=bs.initArray();
while(index==0){
System.out.println("请输入数组数据");
index=bs.initArray();
}
System.out.println("请输入需要查找的关键字(int类型)");
int keyWord=0;
boolean bflag=false;
while(!bflag){
try{
String str=bs.readDate();
keyWord=Integer.parseInt(str);
bflag=true;
}catch(NumberFormatException nfe){
System.out.println("输入的关键字不是int类型,请重新输入");
}catch(Exception ex){
ex.printStackTrace();
}
}
//对数组[0..index]范围内值按升序排序
Arrays.sort(bs.intArray,0,index);
System.out.println("排序后的数组信息");
bs.display(index);
//二分查找
int keyWordIndex=bs.find(keyWord,index);
if(keyWordIndex!=-1){
System.out.println("找到这个关键字,对应在数组中的下标为:"+keyWordIndex);
}else{
System.out.println("找不到这个关键字");
}
//插入新数据
int newWord=10;
bs.insert(keyWordIndex,index,newWord);
index++;
System.out.println("新增后的数组数据");
bs.display(index);
//删除新插入的数据
int word=bs.delete(keyWordIndex,index);
System.out.println(word+"被删除");
index--;
System.out.println("删除后的数组数据");
bs.display(index);
}
}