带有哨兵的顺序表查找和二分法查找(折半查找)(java)代码+说明

一:带有哨兵的顺序表查找

1、算法设计:    
     * 在一个线性表中,按照从前往后或者从后往前的顺序依次查找,如果查找到关键字和给定值相等,则返回给定值的位置,查找成功;
     * 如果查找值最后一个元素仍未找到,则查找失败。
     * 带哨兵的顺序查找,所谓哨兵就是将关键字用一个数组位置去存储,保证在循环的过程中不必判断数组是否越界,因为执行到最后一个元素时,
     * 一定会跳出循环。在一定程度上优化了普通查找算法

  2、  源代码:

public void search_Sq(E e) {int i;data[0] = e;for(i=size;!data[i].equals(e);i--);if(i == 0)System.out.println("没有找到该数据");elseSystem.out.println("成功找到该数据"+data[i]);}

二、二分法查找(折半查找)

1、算法设计:

      * 二分查找,所针对的是有序数组,即数据在之前必须已经由小到大排序完成。
     * 通过寻找中间数并比较大小,确定目标数所在区间,并且不断通过这种方法缩小区间,直到找到目标数。
     * 具体实现如下:
     * 
     * 1. 通过数组容量size确定上(high)下(low)边界,计算得出中间数位置(mid)。
     * 
     * 2. 比较mid处的数与目标数e的大小,确定目标数所在区间(左半部分或右半部分或者该处就是e)。
     * 
     * 3. (1)若X在左半部分,则将上界high左移到mid的左边。再重新确定mid,重复1,2步骤。
     * 
     * (2)若X在右半部分,则将下界low左移到mid的右边。再重新确定mid,重复1,2步骤。
     * 
     * (3)若X即为mid处的数,则返回mid的值。

2、源代码:

public void search_Bin(E e) {int low,high,mid;low = 1;high = size;while(low <=high) {mid = (low + high)/2;if(data[mid].compareTo(e)>0)high = mid -1;else if(data[mid].compareTo(e)<0)low = mid+1;else { System.out.println("成功找到数据"+data[mid]);return ;}}

三、下面为全文源代码,供各位调试数据使用

package com.atguigu.tree;import java.util.Scanner;public class OrderSqList<E extends Comparable <E>> {private E[ ] data;//0号单元不存放元素private int size; //构造函数,传入数组容量构造Arraypublic OrderSqList(int capacity){data =(E[]) new Comparable[capacity];  size=0;}//无参构造函数,默认数组容量为10public OrderSqList() {    this(10);   }   public int getsize() {  return size;    }   public int getCapacity() {  return data.length; }   public boolean isEmpty() {  return size==0;   }public void add(E e) {//判断数组是否已满if(size==data.length)throw new IllegalArgumentException("Add Faild,List is full.");        //移动元素,腾出位置int cur=size;while(cur>=1&&e.compareTo(data[cur])<0) {data[cur+1]=data[cur];cur--;}//将e插入到cur+1位置data[cur+1]=e;//维护sizesize++;}    public E get(int index) {if(index<=0 || index>size)throw new IllegalArgumentException("Get Faild,Index is illegal.");return data[index];}public boolean contains(E e) {for(int i=1;i<=size&&data[i].compareTo(e)<=0;i++)if(data[i].equals(e ))return true;return false;}//按关键字查找//查找数组中元素e所在的索引,如果e不存在,则返回0;public int find(E e) {int i;for(i=1;i<=size&&data[i].compareTo(e)<0;i++);if(i<size && data[i].equals(e))return i;return 0;}  //普通的顺序查找public int search(E e) {int i;          for(i=size;i>=1&&!data[i].equals(e);i--);return i;}//带哨兵的顺序查找/** 在一个线性表中,按照从前往后或者从后往前的顺序依次查找,如果查找到关键字和给定值相等,则返回给定值的位置,查找成功;* 如果查找值最后一个元素仍未找到,则查找失败。* 带哨兵的顺序查找,所谓哨兵就是将关键字用一个数组位置去存储,保证在循环的过程中不必判断数组是否越界,因为执行到最后一个元素时,* 一定会跳出循环。在一定程度上优化了普通查找算法*/public void search_Sq(E e) {int i;data[0] = e;for(i=size;!data[i].equals(e);i--);if(i == 0)System.out.println("没有找到该数据");elseSystem.out.println("成功找到该数据"+data[i]);}//折半查找/** 二分查找,所针对的是有序数组,即数据在之前必须已经由小到大排序完成。* 通过寻找中间数并比较大小,确定目标数所在区间,并且不断通过这种方法缩小区间,直到找到目标数。* 具体实现如下:* * 1. 通过数组容量size确定上(high)下(low)边界,计算得出中间数位置(mid)。* * 2. 比较mid处的数与目标数e的大小,确定目标数所在区间(左半部分或右半部分或者该处就是e)。* * 3. (1)若X在左半部分,则将上界high左移到mid的左边。再重新确定mid,重复1,2步骤。* * (2)若X在右半部分,则将下界low左移到mid的右边。再重新确定mid,重复1,2步骤。* * (3)若X即为mid处的数,则返回mid的值。*/public void search_Bin(E e) {int low,high,mid;low = 1;high = size;while(low <=high) {mid = (low + high)/2;if(data[mid].compareTo(e)>0)high = mid -1;else if(data[mid].compareTo(e)<0)low = mid+1;else { System.out.println("成功找到数据"+data[mid]);return ;}}System.out.println("没有找到该数据");}public E remove(int index) {if(index<=0||index>size)throw new IllegalArgumentException("Remove Faild,Index is illegal.");E ret=data[index];for(int i=index;i<=size-1;i++)data[i]=data[i+1];size--;data[size]=null;return ret;} public E removeFirst() {        return remove(1);   }//删除数组中的元素epublic void removeElement(E e){int index=find(e);if(index==0)throw new IllegalArgumentException(String.format("Remove Faild,%d is not exist.",e));remove(index);}      @Overridepublic String toString() {StringBuilder res=new StringBuilder();res.append(String.format("Array:size=%d,capacity=%d\n",size,data.length));res.append('[');     for(int i=1;i<=size;i++) {res.append(data[i]);if(i!=size)   res.append(",");//元素之间用逗号分隔}      res.append(']');      return res.toString();}public static void main(String[] args) {     OrderSqList<Integer> arr1 = new OrderSqList<>();char key = ' '; //接收用户输入Scanner scanner = new Scanner(System.in);//boolean loop = true;//输出一个菜单while(loop) {System.out.println("s(show): 显示队列");System.out.println("e(exit): 退出程序");System.out.println("a(add): 添加数据");System.out.println("g(get): 查找数据(顺序表)");System.out.println("h(head): 查找数据(二分法)");key = scanner.next().charAt(0);//接收一个字符switch (key) {case 'a':System.out.println("输入添加的数据");int value = scanner.nextInt();arr1.add(value);break;case 's':System.out.println(arr1);break;case 'g':System.out.println("输入想要查找的数据");int value1 = scanner.nextInt();arr1.search_Sq(value1);    break;case 'h':System.out.println("输入想要查找的数据");int value2 = scanner.nextInt();arr1.search_Bin(value2); break;case 'e': //退出scanner.close();loop = false;break;default:break;}}System.out.println("程序退出~~");}}

以上内容参考自其它博主加网络资源汇编。

带有哨兵的顺序表查找和二分法查找(折半查找)(java)代码+说明相关推荐

  1. c语言实现二分法(折半查找)算法

    折半查找(二分法) 折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务.它的基本思想是:在排好序的前提下,设置第一个元素的位置和最后 ...

  2. 数据结构-顺序表结构的实现C语言(全代码)

    课程设计题目 设计出顺序表结构的相关函数库,以便在程序设计中调用. 题目要求 (1)包括线性表的各种基本函数以及常用函数(自己确定函数.函数形式及理由) (2)最好能借助语言环境实现图形显示功能,以便 ...

  3. 顺序表-插入一个元素x后保持该顺序表L递增有序排序(查找+元素后移插入)

    顺序表的存储结构: typedef struct{int data[Maxsize]; //存在顺序表中的元素int length; //存放顺序表的长度}SqList; 分析: 要保持插入一个元素后 ...

  4. 【数据结构】—顺序表的插入、删除、查找操作

    #include <stdio.h> #include <malloc.h> #include <stdlib.h> #define InitSize 10 //默 ...

  5. 2 顺序表的插入,删除,查找操作(详细)

    一 顺序表的结构体定义和函数声明 #include<iostream> using namespace std; #define ElemType int  // 自定义 #define ...

  6. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

  7. 二分法(折半查找)的运用之java实现猜数字游戏

    让计算机输入一个数 然后用户进行猜数游戏 一般而言,七次会猜对,如果猜不对,那么就是你的方法不对 在这儿涉及到的一个算法就是二分法 ***二分法查找,***也称为折半法,是一种在有序数组中查找特定元素 ...

  8. java折半查找(正常的折半查找)

    1 import java.util.Scanner; 2 3 /** 4 * @author Administrator 折半查找 5 */ 6 public class zhebansousuo ...

  9. 斐波那契查找(Fibonacci Search)和折半查找

    两个查找算法都是针对有序数组进行查找,不同点在于分界点的取值不同. 算法介绍 折半查找很简单,每次与当前区间的中点进行比较,然后决定查找前一部分还是后一部分. Fibonacci查找利用了Fibona ...

最新文章

  1. 13、MySQL索引的设计原则
  2. ant基本标签 及import properties
  3. STL 容器和迭代器连载6_顺序容器的操作3
  4. TFS(Visual Studio Team Services) / Azure Devops git认证失败 authentication fails 的解决方案 http协议
  5. 八数码问题的SET实现与哈希实现的比较
  6. paip.sql2008 客户端软件绿色版V319
  7. linux网络适配器驱动程序怎么安装,如何安装网卡驱动_如何重新安装网卡驱动
  8. 怎么用odbc连接mysql数据库连接_怎么用odbc连接mysql数据库
  9. Office - Excel如何查询重复值数量
  10. 小米商城网页制作(附源码)
  11. 本地Blast2GO安装
  12. cassandra cqlsh 使用实际IP或者locahost都可以进入命令行
  13. 关于 trello 和 slack 的感想及使用经验
  14. 计算机语言替换,Zig 0.7.0 发布,想要替换 C的编程语言
  15. 【VMware】虚拟机中映射USB设备
  16. PIPI1003: 最少钱币数c++
  17. idea创建工程java不是蓝色source
  18. ZYNQ7000学习(十八)多路 PWM 原理分析以及实现试验
  19. python实训总结泰坦尼克号_Python-数据清洗与分析案例之泰坦尼克号(一)
  20. bake lightmap in unity 2

热门文章

  1. HBuilder X运行小程序时,打开了微信开发者工具 但微信开发者工具未运行项目但又没有错误提示
  2. Spring事务你可能不知道的事儿
  3. 编写一个扫雷游戏,我们首先要清楚游戏规则
  4. 【H5-chrome】chrome自动播放音频的问题
  5. 卸载wps ubuntu
  6. 视频教程-AI基础实战视频课程(海报书籍、多媒体设计、UI界面设计)-其他
  7. 微信小程序键盘遮挡问题决方案
  8. 消费者追捧iPhone,在于它的性价比超越国产手机
  9. CGI详解(原理,配置及访问)
  10. MATLAB之App designer学习笔记