关于Java有序数组和二分查找浅谈

216 篇文章 1 订阅

本文主要介绍了详解Java数据结构和算法(有序数组和二分查找),具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、概述

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

二、有序数组的优缺点

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

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

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

四、代码实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

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;

   }

}

五、测试

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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

  }

以上就是本文的全部内容,希望对大家的学习有所帮助

转自:微点阅读   https://www.weidianyuedu.com

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值