现在的位置: 首页 > 综合 > 正文

数组-二分查找

2013年07月12日 ⁄ 综合 ⁄ 共 2842字 ⁄ 字号 评论关闭

 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);
 }
}

抱歉!评论已关闭.