详解Java数据结构和算法(有序数组和二分查找)

 更新时间:2017年09月23日 16:21:29   作者:临窗听雨  
本篇文章主要介绍了详解Java数据结构和算法(有序数组和二分查找),具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、概述

有序数组中常常用到二分查找,能提高查找的速度。今天,我们用顺序查找和二分查找实现数组的增删改查。

二、有序数组的优缺点

优点:查找速度比无序数组快多了
缺点:插入时要按排序方式把后面的数据进行移动

三、有序数组和无序数组共同优缺点

删除数据时必须把后面的数据向前移动来填补删除项的漏洞

四、代码实现

public class OrderArray {
  
   private int nElemes; //记录数组长度
   
   private long[] a;
   
   /**
   * 构造函数里面初始化数组 赋值默认长度
   *
   * @param max
   */
   public OrderArray(int max){
     this.a = new long[max];
     nElemes = 0;
   }
   
   //查找方法 (二分查找)
   public int find(long searchElement){
     int startIndex = 0;
     int endIndex = nElemes-1;
     int curIn;
     while(true){
       curIn = (startIndex + endIndex)/2;
       if(a[curIn]==searchElement){
         return curIn; //找到
       }else if(startIndex>endIndex){ //沒有找到
         return nElemes; //返回大于最大索引整数
       }else{ //还要继续找
         if(a[curIn]<searchElement){
           startIndex = curIn + 1; //改变最小索引
         }else{ //往前找
           endIndex = curIn -1;
         }
       }
       
     }
   }
   
   
   //插入元素(线性查找)
   public void insert(long value){
     int j;
     for(j=0;j<nElemes;j++){
       if(a[j]>value){
         break;
       }
     }
     for(int k=nElemes;k>j;k--){
       a[k] = a[k-1];
     }
     a[j] = value;
     nElemes++;
   }
   
   //删除数据项
   public boolean delete(long value){
     int j = find(value);
     if(j==nElemes){
       return false; //没找到
     }else{
       //所有元素往前移动一位
       for(int k=j;k<nElemes;k++)
       a[k] = a[k+1];
       
       nElemes--;
       return true;
     }
   }
   //展示的方法
   public void display(){
     for(int i=0;i<nElemes;i++){
       System.out.print(a[i]+" ");
     }
   }
   
   public int size(){
     return nElemes;
   }
}

五、测试

 public static void main(String[] args) {
     int max = 100;
     OrderArray oa = new OrderArray(max);
     oa.insert(12);
     oa.insert(14);
     oa.insert(90);
     oa.insert(89);
     oa.insert(87);
     oa.insert(88);
     oa.insert(67);
     oa.display();
     int searchkey = 90;
     if(oa.find(searchkey)!=oa.size()){
       System.out.println("found"+searchkey);
     }else{
       System.out.println("not found");
     }
     oa.delete(88);
     oa.delete(90);
     oa.delete(89);
     oa.display();
   }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java volatile关键字的含义详细介绍

    java volatile关键字的含义详细介绍

    这篇文章主要介绍了java volatile关键字的含义详解的相关资料,需要的朋友可以参考下
    2016-12-12
  • Java下载文件的4种方式总结

    Java下载文件的4种方式总结

    这篇文章主要给大家总结介绍了关于Java下载文件的4种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 在Spring Boot2中使用CompletableFuture的方法教程

    在Spring Boot2中使用CompletableFuture的方法教程

    这篇文章主要给大家介绍了关于在Spring Boot2中使用CompletableFuture的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2019-01-01
  • Spring Security获取用户认证信息的实现流程

    Spring Security获取用户认证信息的实现流程

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI和AOP功能,为应用系统提供声明式的安全访问控制功能
    2022-12-12
  • Java实现多线程同步五种方法详解

    Java实现多线程同步五种方法详解

    这篇文章主要介绍了Java实现多线程同步五种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 浅谈maven单元测试设置代理

    浅谈maven单元测试设置代理

    下面小编就为大家带来一篇浅谈maven单元测试设置代理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java超详细分析讲解final关键字的用法

    Java超详细分析讲解final关键字的用法

    关于final关键字,它也是我们一个经常用的关键字,可以修饰在类上、或者修饰在变量、方法上,以此看来定义它的一些不可变性!像我们经常使用的String类中,它便是final来修饰的类,并且它的字符数组也是被final所修饰的。但是一些final的一些细节你真的了解过吗
    2022-06-06
  • Spring中Bean的生命周期实例解析

    Spring中Bean的生命周期实例解析

    这篇文章主要介绍了Spring中Bean的生命周期实例解析,我们定义一个自定义的MySpringBeanPostProcessor,主要是重写了BeanPostProcessor接口的postProcessBeforeInitialization与postProcessAfterInitialization方法,需要的朋友可以参考下
    2023-12-12
  • java如何替换word/doc文件中的内容

    java如何替换word/doc文件中的内容

    docx格式的文件本质上是一个XML文件,只要用占位符在指定的地方标记,然后替换掉标记出的内容,这篇文章主要介绍了java替换word/doc文件中的内容,需要的朋友可以参考下
    2023-06-06
  • java实现代码统计小程序

    java实现代码统计小程序

    这篇文章主要为大家详细介绍了java实现代码统计小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09

最新评论