实验七--查找算法

来源:互联网 发布:最新软件开发平台 编辑:程序博客网 时间:2024/06/03 14:21

一、    实验目的:

1.  熟练掌握常用的顺序查找法,折半查找法等查找算法。

2.  深入理解各种查找算法的结构特点及各算法之间的区别。

二、    实验内容:

1.常用的一些查找算法。

2.各种查找算法的结构特点及各算法之间的区别。

三、     实验要求:

阅读以下四个类:

RecordNode.java

SeqList_Sort.java

Search_Manager.java   

Sort_Test.java

将SeqList_Sort.java中的三个查找方法补充完整。

源程序见附件

RecordNode.java

----------------------RecordNode.java ---------------------

package Search;

import java.util.Scanner;

public class RecordNode

{

   publicint key   ;  // 关键字,用整型可以直接用关系运算符比较大小

   publicString element; // 记录的其它部分,用字符串,方便输出

   Scannersin = new Scanner(System.in);

   publicRecordNode()

   {

      System.out.println("请输入关键字:");

      this.key=sin.nextInt();

      System.out.println("请输入元素值:");

      this.element=sin.next();   

   }

 

   publicRecordNode(int key)

   {

      this.key=key;

   }

     

   publicRecordNode(int key , String element)

   {

      this.element= element;

      this.key=key;

   }

  

   publicString toString()

   {

      returnthis.key+" "+this.element+" ";

   }

}

----------------------RecordNode.java ---------------------

-------------------- SeqList_Search.java-------------------

/**

 *构造用于排序的线性表,

 *元素位置从下标1开始

 *分别设置各种不同的查找算法

 *查找成功,返回 位序,查找失败,返回 0

 **/

package Search;

import Search.RecordNode;

import java.util.Scanner;

import java.util.Random;

public class SeqList_Search 

{

   publicRecordNode [ ] r;

   publicint curlen;

     

   publicSeqList_Search(int maxSize) //构造方法,用参数做为线性表的初始空间大小

   {

      this.curlen=0;

      this.r= new RecordNode[maxSize];

   }

  

   publicSeqList_Search()  //构造方法,以默认100做为初始空间大小

   {

      this(100);

   }

 

   publicvoid create(int n)  // 输入生成线性表,参数为输入元素个数

   {

       Scanner sin =new Scanner(System.in);

          

      System.out.println("\t输入"+n+"个线性表的元素:");

      for(inti=1;i<=n;i++)

      {

        try{

          RecordNodenewdata=new   RecordNode  ();

           this.insert(i,newdata);          

           }

        catch(Exceptione)

        {

           System.out.println("\t插入位置不合适,无法创建");

        }

      }

   }

  

   publicvoid create( )// 随机数生成10个元素

   {          

      System.out.println("\t生成"+10+"个线性表的元素");

      for(inti=1;i<=10;i++)

      {

        try{

           Randomrd = new Random();

           RecordNodenewdata = new RecordNode(rd.nextInt(100),"A"+i);

           this.insert(i,newdata);          

           }

        catch(Exceptione)

        {

           System.out.println("\t插入位置不合适,无法创建");

        }

      }

   }

 

   publicvoid clear()//清空

   {

      this.curlen=0;

   }

  

   publicboolean isEmpty() //判断是否为空

   {

      if( this.curlen ==0 )

          return true;

      else

          return false;

   }

  

   publicint length() //求长度

   {

      returnthis.curlen;

   }

  

   publicRecordNode get(int i) throws Exception //求指定位置元素

   {

      if( i < this.curlen)

         return this.r[i];

      else

      {

        thrownew Exception("elem no."+i+" not exist!");

      }

   }

  

   publicvoid insert(int i,RecordNode x)throws Exception //在指定的位置上插入数据元素

   {

      if(this.curlen == this.r.length)

      {

      // throw new Exception("overflow!");

          RecordNode newlist[]=newRecordNode[2*this.curlen];

          for(int j=this.curlen;j>0;j--)

          {

            newlist[j]=this.r[j];

          }

          this.r=newlist;       

      }

      if(i<1|| i>this.curlen+1)

        thrownew Exception("position error!");    

      for(intj =this.curlen ; j >=i ; j-- )

      {

        this.r[j+1] =this.r[j] ;

      }

      this.r[i]=x;

      this.curlen++;     

   } 

 

   publicvoid remove(int i) //删除指定位置上的元素

   {

      for(int  j = i+1 ; j<= this.curlen ; j++)

      {

        this.r[j-1]=this.r[j];

      }

      this.curlen--;

   } 

 

   publicint indexOf(RecordNode x)

   {

        int i;

        for( i=this.curlen; i>0 ; i--)

        {

         if(this.r[i].equals(x))

                 break;

        }

        return i;      

   }//查找指定元素的位置

  

   publicvoid display()

   {

      System.out.println("\n\t线性表的元素是");

     

         for(int i = 1; i <= curlen ;i++)

         {

               System.out.println("\t"+this.r[i]);

         }

      System.out.println();

   }//输出线性表的所有元素值

  

 

  

//---------------------Search---------------------------

 

//---------------------seqSearch---------------------------

public int seqSearch(int Key)

{

   //顺序查找

   int i = 1,n = length();

   while(i<n&&r[i].key!=Key)

   {

     i++;

   } 

   if(i<n)

   {

     return i;

   }

   else

   {

     return 0;

   }

}

 

   //---------------------seqSearchWithGuard---------------------------

   publicint seqSearchWithGuard(int Key)

   {

      r[0]= new RecordNode(Key);

   //带岗哨的顺序查找

      inti = length();

      r[0].key= Key;

      while(r[i].key!=Key)

      {

        i--;

      }

      if(i>0)

      {

        returni;

      }

      else

      {

        return0;

      }

   }

  

   //---------------------binarySearch---------------------------

   publicint binarySearch(int Key)

   {

   //折半查找

        if(length()>0)

        {

          int low = 0,high =length()-1;

          while(low<=high)

          {

             int mid = (low+high)/2;

             if(r[mid].key==Key)

             {

                return mid;

             }

             elseif(r[mid].key!=Key)

             {

                high = mid - 1;

             }

             else

             {

                low = mid+1;

             }

          }

        }

        return 0;

   }

   //---------------------seqSearch------------------------

}

---------------------SeqList_Search.java-------------------

---------------------SeqList_Manager.java------------------

package Search;

import Search.RecordNode;

import Search.SeqList_Search;

import java.util.Scanner;

 

public class Search_Manager

{

   staticScanner sin = new Scanner(System.in);

    SeqList_Search test ;

  

   publicSearch_Manager()

   {

      test= new SeqList_Search (); 

   }

    

                      

   private  void seqSearch() throws Exception

   {         

      test.create(); 

      test.display();

       int Search_Key ;

       int Search_result = 0 ;

      System.out.println("输入待查找的关键字值:");

      Search_Key= sin.nextInt();

     Search_result =test.seqSearch(Search_Key); 

      if(Search_result != 0)

          {

            System.out.println("查找成功,查找结果是:");

            System.out.println(test.get(Search_result).toString());

          }

          test.clear();

   }

 

   private  void seqSearchWithGuard() throws Exception

   {

          

      test.create(); 

      test.display();

      int  Search_Key ;

       int Search_result = 0 ;

      System.out.println("输入等查找的关键字值:");

      Search_Key= sin.nextInt();

      Search_result=test.seqSearchWithGuard(Search_Key);

      if(Search_result != 0)

          {

            System.out.println("查找成功,查找结果是:");

            System.out.println(test.get(Search_result).toString());

          }        

          test.clear();

   }

  

   private  void binarySearch() throws Exception

   {    

      System.out.println("请按关键字有序输入创建查找表:");

      test.create(10);

      test.display();

       int Search_Key ;

       int Search_result = 0 ;         

     

         System.out.println("输入要查找的关键字的值:");

       Search_Key = sin.nextInt(); 

      Search_result=test.binarySearch(Search_Key);

      if(Search_result != 0)

          {

            System.out.println("查找成功,查找结果是:");

            System.out.println(test.get(Search_result).toString());

          }

          test.clear();

   }

  

   voidrun () throws Exception

   {

      do

       {

                  System.out.println("  ---------Menu--------");

              System.out.println("  1 seqSearch");

              System.out.println("  2 seqSearchWithGuard ");

              System.out.println("  3  binarySearch");     

              System.out.println("  0 Quit  ");

              System.out.println("  ---------end----------");

           

                  System.out.print("  请选择查找算法:");

                  intchoice = sin.nextInt();

                       

               if(choice == 0 )

                       System.exit(0);

                   

                   switch(choice)

               {

                    case1:     seqSearch();

                            break;                                   

                    case2:    seqSearchWithGuard();

                                break;                             

                    case3:     binarySearch();

                            break;    

                    default:System.out.println("error,end");break;           

                 } 

                    System.out.println("_______请继续选择_________");

           

     } while(true);

   }

}

---------------------SeqList_Manager.java------------------

---------------------SeqList_Test.java---------------------

package Search;

import Search.Search_Manager;

import java.util.Scanner;

 

public class Search_Test

{

   publicstatic void main(String [] args) throws Exception

   {

      newSearch_Manager().run();

   }

}

---------------------SeqList_Test.java---------------------

远行结果如下:




阅读全文
0 0
原创粉丝点击