美文网首页程序员
Java数据结构和算法(有序数组和二分查找)

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

作者: 临窗听雨 | 来源:发表于2017-09-23 14:19 被阅读100次

一、概述

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

二、有序数组的优缺点

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

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

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

四、代码实现

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

相关文章

  • 二分查找及其扩展

    在有序数组中,二分查找是效率较高的查找算法。二分查找一般有递归和迭代 对有序数组查找指定数字在数组中出现的次数//...

  • 数据结构与算法--二叉查找树

    数据结构与算法--二叉查找树 上节中学习了基于链表的顺序查找和有序数组的二分查找,其中前者在插入删除时更有优势,而...

  • 数据结构与算法--散列表

    数据结构与算法--散列表 之前学习了基于链表的顺序查找、基于有序数组的二分查找、二叉查找树、红黑树,这些算法在查找...

  • PHP算法

    PHP算法 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组二...

  • Java 二叉树、红黑树、B+树

    数组和链表是常用的数据结构,数组虽然查找快(有序数组可以通过二分法查找),但是插入和删除是比较慢的;而链表,插入和...

  • JavaScript实现二分查找

    最近撸《算法》第四版,开篇就是一个Java版本的二分查找算法,下面以JS实现一下。 二分查找的前提为:数组、有序。...

  • 想去阿里——这是你必备的实力

    算法和数据结构数组、链表、二叉树、队列、栈的各种操作(性能,场景) 二分查找和各种变种的二分查找 各类排序算法以及...

  • 想去阿里——这是你必备的实力

    算法和数据结构数组、链表、二叉树、队列、栈的各种操作(性能,场景)二分查找和各种变种的二分查找各类排序算法以及复杂...

  • day13

    查找算法 顺序查找 二分查找 差值查找 斐波那契查找 二分查找 前提数组必须是有序的。 升级 Interpolat...

  • 算法

    一.算法基础--算法的特性 二.算法基础--算法的复杂度 三.顺序查找和二分查找 顺序查找 二分查找(前提是有序的...

网友评论

    本文标题:Java数据结构和算法(有序数组和二分查找)

    本文链接:https://www.haomeiwen.com/subject/jjscextx.html